Unity3D加密——数据安全方面
按照我自己的理解
我把Unity的加密分为三个方向
每个方向是完全不同的内容,同时又是不得不防的不同方面
加密方向:
1.C# dll 加密
2.数据加密(模型,纹理贴图,UI)
3.阻断安装(加密狗,序列号)
本文主要讨论的是第2种
数据方向的加密
尽管资源(Assets)在传输时可使用加密进行保护,但在数据流入客户手中后,其内容就有可能被获取,例如,有的工具可以记录驱动程序上的3D数据,允许用户获取传送至GPU的模型和纹理,因此,我们的立场通常是在用户决定提取资源时,才满足用户要求。
当然,如果需要,也可以对资源包(AssetBundle)文件使用自己的加密方式进行数据密。
上面是官方的一段描述
就不废话了,还是直接贴代码吧。。
//1.加密:对assetbundle的字节数组每位进行与key的异或处理(相同为0,不同为1) using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace AbEncypt { class Program { const Byte key = 157; static void Main(string[] args) { var dir = Directory.GetCurrentDirectory(); foreach (var f in new DirectoryInfo(dir).GetFiles("*.assetbundle", SearchOption.AllDirectories)) { Byte[] temp = File.ReadAllBytes(f.FullName); Encypt(ref temp); File.WriteAllBytes(f.FullName, temp); } } static void Encypt(ref Byte[] targetData) { int dataLength = targetData.Length; for (int i = 0; i < dataLength; ++i) { targetData[i] = (byte)(targetData[i] ^ key); } } } }
//2.解密 WWW www = new WWW(User.BundleUrl); yield return www; byte[] stream = www.bytes; Encypt(ref stream); AssetBundle bundle = AssetBundle.LoadFromMemory(stream);
使用方法:
1.加密
将加密代码放在一个新的VS工程里
并发布成exe文件
把这个exe文件放在AssetBundle的文件夹中
运行exe文件,便已经将刺文件夹下的所有AssetBundle文件加密了
2.解密
再运行一次exe文件,便可以解密
3.使用过程
将AssetBundle文件制作好之后,先进行加密,然后才能把AssetBundle提交给服务端以供下载
将解密代码写在客户端读取AssetBundle前,然后就可以正常读取AssetBundle了
原理:
此方法简单暴力
将AssetBundle文件中的每一个字符都与一个秘钥异或处理,就完成了加密
上面代码中“157”这个数字就是秘钥,一定要注意对秘钥的保密
再进行一次异或,所有字符又会变回之前的数据,变回正常的AssetBundle
可以进行一些变种
除了使用其他秘钥外
还可以只异或第一个字符、前两个字符等等形式
虽然是一种很简单的方式,但是想要破解,难度还是非常大的~