在Unity游戏中加一个签名验证对防止反编译后二次打包。
先来个参考unity链接 http://www.jianshu.com/p/b7e43696ee50,这个是
FileUtility是没有的,不过和下面这个有联系
安卓代码获得md5值链接http://www.jianshu.com/p/e7fa21c4d3cf
接下来结合上面两部分,得出安卓调用unity的调用方法,下面直接祭出代码,睡觉。。。
public static string GetSignatureMD5Hash() { var player = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); var activity = player.GetStatic<AndroidJavaObject>("currentActivity"); var PackageManager = new AndroidJavaClass("android.content.pm.PackageManager"); var packageName = activity.Call<string>("getPackageName"); var GET_SIGNATURES = PackageManager.GetStatic<int>("GET_SIGNATURES"); var packageManager = activity.Call<AndroidJavaObject>("getPackageManager"); var packageInfo = packageManager.Call<AndroidJavaObject>("getPackageInfo", packageName, GET_SIGNATURES); var signatures = packageInfo.Get<AndroidJavaObject[]>("signatures"); if (signatures != null && signatures.Length > 0) { byte[] bytes = signatures[0].Call<byte[]>("toByteArray"); string str= getSignValidString(bytes); Debug.Log(string.Format("<color=#ffffffff><---{0}-{1}----></color>", str, "test1")); return str; } return null; } private static String getSignValidString(byte[] paramArrayOfByte) { var MessageDigest = new AndroidJavaClass("java.security.MessageDigest"); var localMessageDigest = MessageDigest.CallStatic<AndroidJavaObject>("getInstance","MD5"); localMessageDigest.Call("update", paramArrayOfByte); return toHexString(localMessageDigest.Call<byte[]>("digest")); } public static String toHexString(byte[] paramArrayOfByte) { if (paramArrayOfByte == null) { return null; } StringBuilder localStringBuilder = new StringBuilder(2 * paramArrayOfByte.Length); for (int i = 0; ; i++) { if (i >= paramArrayOfByte.Length) { return localStringBuilder.ToString(); } String str = new AndroidJavaClass("java.lang.Integer").CallStatic<String>("toString", 0xFF & paramArrayOfByte[i],16); if (str.Length == 1) { str = "0" + str; } localStringBuilder.Append(str); } }