加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

AssetBundle默认是不加密的

发布时间:2022-10-26 19:00:49 所属栏目:安全 来源:互联网
导读: AssetBundle默认是不加密的,使用AssetStudio工具是可以对资源进行解密的,加密方式有很多种。1、unity中国区提供的一种加密方式
1.1、打包前先设置秘钥:(秘钥是16位的任意数字字母组合)

AssetBundle默认是不加密的,使用AssetStudio工具是可以对资源进行解密的,加密方式有很多种。1、unity中国区提供的一种加密方式

1.1、打包前先设置秘钥:(秘钥是16位的任意数字字母组合)

AssetBundle.SetAssetBundleDecryptKey("0123456789abcdef");

可以通过设置 AssetBundle.SetAssetBundleDecryptKey(null)来取消AB包加密

1.2、加载前,先指定加载秘钥( 游戏启动时设置一次就可以了,不需要每次加载都设置)

AssetBundle.SetAssetBundleDecryptKey("0123456789abcdef");

不过这个加密方式有个弊端就是每次资源变动计算出的MD5是不一致的,即使资源还原,再打AB包,计算的MD5值也不会跟之前的重复,这种加密方式用来做热更会比较麻烦,需要自己去做一下处理。

这个就不多说了,继续说第二种加密方式

2、对AB包的二进制文件进行加密操作

不过这种方式加载是需要使用AssetBundle.LoadFromMemoryAsync或者AssetBundle.LoadFromMemory进行加载:

AssetBundle abBundle = AssetBundle.LoadFromMemory(File.ReadAllBytes(filePath));

this._loadRequest =AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(filePath));

不过这种加密方式需要在先把文件的字节数加载到内存中,再通过API加载文档加密方式,这样会在内存中存在双份内存,会造成较高的内存峰值,所以本人不推荐该加载方式。

3、使用offest加密

原理就是对AssetBundle的二进制文件添加一些字符,来达到加密的目的,废话不多说,直接上代码:

将你需要加密的AB包文件路径传入,你的AB包就加密成功了

public static void ABOffsetEncryption(string fileFile)

{

byte[] oldData = File.ReadAllBytes(fileFile);

int newOldLen = 8 + oldData.Length;//这个空字节数可以自己指定,示例指定8个字节

var newData = new byte[newOldLen];

for (int tb = 0; tb < oldData.Length; tb++)

{

newData[8+ tb] = oldData[tb];

}

FileSt

ream fs = File.OpenWrite(fileFile);//打开写入进去

fs.Write(newData, 0, newOldLen);

fs.Close();

}

有加密就有解密,unity官方提供的AB包加载API,有提供根据Offset进行加载AB

3.1、同步加载

AssetBundle abBundle = AssetBundle.LoadFromFile(assetBundleMapPath,0,8);

3.2、异步加载

this._loadRequest = AssetBundle.LoadFromFileAsync(this.filePath,0,8);

总结:第一种MD5不稳定,第二种会造成双倍内存,第三种虽然加密简单,但是没有前两者的弊端。

本人推荐第三种通过Offset加密。使用官方提供的API通过Offset进行加载。

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!