1. 程式人生 > >Unity5.4 Assetbundles官方說明八(資料安全方面的處理)

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!