Unity5.4 Assetbundles官方说明(数据安全方面的处理)

 尽管资源(Assets)在传输时可使用加密进行保护,但在数据流入客户手中后,其内容就有可能被获取,例如,有的工具可以记录驱动程序上的3D数据,允许用户获取传送至GPU的模型和纹理,因此,我们的立场通常是在用户决定提取资源时,才满足用户要求。
  当然,如果需要,也可以对资源包(AssetBundle)文件使用自己的加密方式进行数据加密。
  一种方式是,使用文本资源(TextAsset)类型将数据存储为字节,然后可以加密数据文件,并使用扩展名为.bytes进行保存,Unity会将其视为文本资源(TextAsset)类型。在编辑器(Editor)中导入后,作为文本资源(TextAsset)的文件可保存在服务器上的资源包(Assetbundle)中。客户可以下载资源包(AssetBundle)并将存储在包中的文本资源(TextAsset)进行解密。借助此方法,既不会对资源包(Assetbundle)加密,又可以将数据作为文本资源(TextAsset)保存,下面是一个官方的简单案例。
/// <summary>
/// 1、下载资源包后,把包中的加密文本资源数据进行解密
/// </summary>
IEnumerator DownLoadEncryptedData1()
{
string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";

while (!Caching.ready)
yield return null;

//下载加密数据
WWW www = WWW.LoadFromCacheOrDownload(url, 1);
yield return www;

//从资源包中加载TextAsset
TextAsset textAsset = www.assetBundle.LoadAsset<TextAsset>("EncryptedData");

//获取加密的字节数据
byte[] encryptedData = textAsset.bytes;

//使用自己的解密方法进行解密处理
byte[] decryptedData = YourDecryptionMethod(encryptedData);

//接下来就可以使用字节数据,而AssetBundle将被缓存

……
}


  另一种方式是在打包时把AssetBundles资源包全部加密,然后使用WWW类下载它们,只要服务器端把资源包作为二进制数据提供下载,就可以使用任何想要的扩展名,就像AssetBundle打包一样(AssetBundle名称可以带任何扩展名,例如Cube.ab),然后用WWW把资源包下载下来后,就可以使用特定的解密程序将资源包的字节数据进行解密处理,然后可以用AssetBundle.CreateFromMemory方法从内存中的加载AssetBundle。下面是官方的简单案例:
/// <summary>
/// 2、直接获取下载的字节数据,进行解密后,从数据中创建AssetBundle
/// </summary>
/// <returns></returns>
IEnumerator DownLoadEncryptedData2()
{
//下载加密的资源包
WWW www = new WWW(url);
yield return www;

//获取资源包的字节数据
byte[] encryptedData = www.bytes;

使用特定的解密程序解密资源包数据(目前解密后的数据存储在内存中)
//byte[] decryptedData = YourDecryptionMethod(encryptedData);

从内存中加载AssetBundleCreateRequest,然后获取AssetBundle
//AssetBundleCreateRequest acr = AssetBundle.LoadFromMemoryAsync(decryptedData);
//yield return acr;
//AssetBundle bundle = acr.assetBundle;

//接下来可以使用AssetBundle了,AssetBundle没有被缓存
……
}

  第二个方法的好处是,我们可以使用除了WWW.LoadFromCacheOrDownload以外的任何方法来传输字节数据(因为LoadFromCacheOrDownload涉及到版本号,只能下载AssetBundle资源包,不能用于字节数据),而且数据是被完全加密的,例如我们可以使用WWW加载或者使用Socket传输。缺点是无法使用Unity的自动缓存功能进行缓存,我们可以在磁盘上手动存储文件,并使用AssetBundles.CreateFromFile来加载存储的文件。

  第三种方法结合了前两种方法的优点,可将资源包 (AssetBundle) 作为文本资源 (TextAsset)存储在其他普通资源包中。那么包含了加密包的普通资源包会被自动缓存,然后会将原始资源包 (AssetBundle) 加载到内存,我们获取原始包中的加密资源,进行解密处理后,使用AssetBundle.CreateFromMemory进行获取解密后的AssetBundle,然后可以进行使用资源。下面是官方的简单案例:
/// <summary>
/// 3、下载资源包后,获取包中的文本资源,进行解密后,将文本资源中的AssetBundle加载出来
/// </summary>
IEnumerator DownLoadEncryptedData3()
{

string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";
while (!Caching.ready)
yield return null;

WWW www = WWW.LoadFromCacheOrDownload(url, 1);
yield return www;

//从资源包中加载TextAsset类型的资源
TextAsset textAsset = www.assetBundle.LoadAsset<TextAsset>("EncryptedData");

//得到字节数据
byte[] encryptedData = textAsset.bytes;

//进行解密处理
byte[] decryptedData = YourDecryptionMethod(encryptedData);

//然后从解密后的字节数组中创建AssetBundle
AssetBundleCreateRequest acr = AssetBundle.LoadFromMemoryAsync(decryptedData);
yield return acr;

AssetBundle bundle = acr.assetBundle;

//接下来可以使用AssetBundle了,而且AssetBundle被自动缓存
……
}


  这是官方提供的数据加密方式,其实实际项目中可根据自己的情况进行加密处理,目前比较流行的应该是使用MD5加密和解密,这种方法非常简单,当然也可以使用自己的加密算法和程序进行加密处理。
--------------------- 
作者:IQ007伟哥 
来源:CSDN 
原文:https://blog.csdn.net/u010377179/article/details/52922718 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值