• Unity3d项目中获取APK包签名公钥的方法,核心思想就是通过JNI调用Android提供的方法。不过Unity3d提供了比JNI更上一层的类AndroidJavaObject以及继承它的AndroidJavaClass,帮助开发者省去很多工作。这两种类型的...

    在Unity3d项目中获取APK包签名公钥的方法,核心思想就是通过JNI调用Android提供的方法。不过Unity3d提供了比JNI更上一层的类AndroidJavaObject以及继承它的AndroidJavaClass,帮助开发者省去很多工作。这两种类型的函数及内部原理可以看Unity3d官网,也可以反编译看里面的代码,直接说用法。

    首先要获取到当前运行程序的Activity才好继续以后的操作。Unity3d在程序启动时记录下了这个值,可以通过UnityPlayer类的静态字段currentActivity来取得,UnityPlayer是由UnityPlayerActivity这个继承自Activity的类在onCreate时创建并传入当前Activity(详细流程可以通过jd-gui或反编译项目smali查看)。取到Activity以后就可以getPackageManager、getPackageInfo来获取到签名。得到的签名据说保存了公钥以及其他一些信息,这个没有具体深入了解,但是可以从签名获取到公钥是一定可以的,CertificateFactory的generateCertificate、getPublicKey方法取得最终值。下面是完整代码,注释对应java代码:

    
        private byte[] GetSignature()
        {
            //Player = new UnityPlayer();
            AndroidJavaClass Player = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            //Activity = Player.currentActivity;
            AndroidJavaObject Activity = Player.GetStatic<AndroidJavaObject>("currentActivity");
            //PackageManager = Activity.getPackageManager();
            AndroidJavaObject PackageManager = Activity.Call<AndroidJavaObject>("getPackageManager");
            //GET_SIGNATURES = PackageManager.GET_SIGNATURES;
            int GET_SIGNATURES = PackageManager.GetStatic<int>("GET_SIGNATURES");
            //PackageInfo = PackageManager.getPackageInfo("com.ztx.uni", PackageManager.GET_SIGNATURES);
            AndroidJavaObject PackageInfo = PackageManager.Call<AndroidJavaObject>("getPackageInfo", "com.ztx.uni", GET_SIGNATURES);
            //Signatures = PackageInfo.signatures;
            AndroidJavaObject[] Signatures = PackageInfo.Get<AndroidJavaObject[]>("signatures");
            //return Signatures[0].toByteArray();
            return (Signatures != null && Signatures.Length > 0) ? Signatures[0].Call<byte[]>("toByteArray") : null;
        }
    
        private string GetPublicKey()
        {
            byte[] Signatures = GetSignature();
    
            if (Signatures != null)
            {
                //CCertificateFactory = new CertificateFactory();
                AndroidJavaClass CCertificateFactory = new AndroidJavaClass("java.security.cert.CertificateFactory");
                //OCertFactory = CCertificateFactory.getInstance();
                AndroidJavaObject OCertFactory = CCertificateFactory.CallStatic<AndroidJavaObject>("getInstance", "X.509");
                //OByteArrayInputStream = new ByteArrayInputStream(Signatures);
                AndroidJavaObject OByteArrayInputStream = new AndroidJavaObject("java.io.ByteArrayInputStream", Signatures);
                //OX509Certificate = OCertFactory.generateCertificate(OByteArrayInputStream);
                AndroidJavaObject OX509Certificate = OCertFactory.Call<AndroidJavaObject>("generateCertificate", OByteArrayInputStream);
                //OPublicKey = OX509Certificate.getPublicKey();
                AndroidJavaObject OPublicKey = OX509Certificate.Call<AndroidJavaObject>("getPublicKey");
    
                string publickey = OPublicKey.Call<string>("toString");
                AndroidJavaObject CString = new AndroidJavaObject("java/lang/String", publickey);
                int start = CString.Call<int>("indexOf", "modulus");
                int end = CString.Call<int>("indexOf", "public");
    
                if (start >= 0 && end >= 0)
                {
                    return CString.Call<string>("substring", start + 8, end - 1);
                }
            }
            
            return null;
        }
    

    在GetPublicKey()中取得的OPublicKey是如下的形式:

    OpenSSLRSAPublicKey
    {modulus=d6931904dec60b24b1edc762e0d9d8253e3ecd6ceb1de2ff068ca8e8bca8cd6bd3786ea70aa76ce
    60ebb0f993559ffd93e77a943e7e83d4b64b8e4fea2d3e656f1e267a81bbfb230b578c20443be4c7218b846f
    5211586f038a14e89c2be387f8ebecf8fcac3da1ee330c9ea93d0a7c3dc4af350220d50080732e0809717ee6
    a053359e6a694ec2cb3f284a0a466c87a94d83b31093a67372e2f6412c06e6d42f15818dffe0381cc0cd444d
    a6cddc3b82458194801b32564134fbfde98c9287748dbf5676a540d8154c8bbca07b9e247553311c46b9af76
    fdeeccc8e69e7c8a2d08e782620943f99727d3c04fe72991d99df9bae38a0b2177fa31d5b6afee91f,publicExponent=3}

    而我们要的只是其中的256位公钥,所以在函数后面取了modulus和publicExponent之间的值。至此全部工作结束,很简单吧,如果在ndk中做公钥提取也是这个道理,不过要写很多很多代码。。

    展开全文
  • 1.以管理员身份运行CMD 2.在cmd下进入jdk的bin目录 3.在bin目录下keytool -list -v -keystore D:\KeyStore\user.keystore(文件路径) -storepass 123456(文件密码)回车即可

    1.以管理员身份运行CMD
    2.在cmd下进入jdk的bin目录
    3.在bin目录下keytool -list -v -keystore D:\KeyStore\user.keystore(文件路径) -storepass 123456(文件密码)回车即可

    展开全文
  • 点击studio右侧面板的Gradle标签,选择app模块展开,选择Tasks展开,选择android展开,双击signingReport运行,下面Run里会出现签名信息

    点击studio右侧面板的Gradle标签,选择app模块展开,选择Tasks展开,选择android展开,双击signingReport运行,下面Run里会出现签名信息

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 1.勾选Create New Keystore复选框。 2.点击Browse keystore。也就是设置制作的keystore的路径和名字。 3.keystore password:设置keystore的密码 。 4.Confirm password:确认keystore的密码。 5.Key:点击Unsigned...

    生成keystore方法
    在这里插入图片描述
    1.勾选Create New Keystore复选框。

    2.点击Browse keystore。也就是设置制作的keystore的路径和名字。

    3.keystore password:设置keystore的密码 。

    4.Confirm password:确认keystore的密码。

    5.Key:点击Unsigned(debug)之后会有一个下拉列表选择Create a new Key。并弹出一个二级弹框设置。

    6.在二级弹框中的Alias:设置别名

    7.password:密码

    8.confirm:密码确认。

    9.其他的设置可以根据需要设置。
    在这里插入图片描述
    10.最后点击Create key。

    11.最后点击Build Setting中的Build。

    12.最后打包成功之后就有keystore文件。

    dos命令:先进入该文件的文件夹
    keytool -list -v -keystore user.keystore

    展开全文
  • 轻松获取SHA1

    2019-01-23 17:21:30
    首先jdk这些就不用讲了哈,环境配置ok是前提 待会我会贴出步骤图哈 第一步:win+R 输入cmd 进入命令提示符 第二步:通过cd:定位到你的jdk路径下的bin文件夹处 第三步:输入:keytool -list -keystore D:my.keystore...

    首先jdk这些就不用讲了哈,环境配置ok是前提
    待会我会贴出步骤图哈
    第一步:win+R 输入cmd 进入命令提示符
    第二步:通过cd:定位到你的jdk路径下的bin文件夹处
    第三步:输入:keytool -list -keystore D:my.keystore(后面D:my.keystore表示你自己生成的keystore文件位置)
    第四步:回车,提示你输入密钥:你自己keystore的密钥
    接着大功告成啦
    下面是截图教程
    在这里插入图片描述定位到你的jdk的bin目录下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 这里,用了一个比较偷懒的办法,直接用高德提供的android定位sdk,没有重新编译。好处是省事,坏处是,没法修改默认的...这里的key和编译环境的sha1相关。 新建一个unity项目 先把项目编译成android,记得Bu
  • 在之前的文章中,我们提到了用ulua的热更新框架,其中最后提及了通过文件MD5码比对来判断文件是否更新,假如MD5码不一致则...1.读取文件流 2.读取文件流中的字节数据 3.通过MD5接口生成MD5码(获得的是一个Hash字节数
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题
  • Unity 脚本 关于网络请求的方法有如下: public WWW (string url, byte[] postData, Dictionarystring, string> headers) public WWW (string url, byte[] postData, Hashtable headers) -----> ...
  • Unity3D_Util_加密

    2019-07-04 19:16:20
    Unity开发中常用的加密算法 MD5,Sha1、CRC32,Des,Res等的实现 public class EncryptUtil { #region MD5 public static string MD5Encrypt(string str, int length = 32) { if (...
  • 版本:unity 5.4.1 语言:C#   这本书有点蛋疼,说了配置文件的读取之后,他说了两种算法: //OBFS 加密算法 private static string OBFS(string str) { int length = str.Length; var array = new char...
  • 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果您在Shader开发上有所心得,很欢迎并恳请您指出...
  • 很多人一定搞不懂 SV_GroupID, SV_GroupThreadID, SV_GroupIndex, SV_...[numthreads(32, 32, 1)] 代表: 一個 Group 分配幾個 Thread,X * Y * Z 不得超過 1024 這同時也是一個 Group 的長寬高 //sha...
  • 官方介绍:https://docs.unity3d.com/Manual/AssetBundlesIntro.html AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行时被加载(热更); AssetBundle自身保存着互相的依赖...
  • 猫都能学会的Unity3D Shader入门指南(一) 动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解。虽然说Unity引擎设计的...
  • HMAC-SHA1 算法 //HMAC-SHA1 算法1 public static object HMAC_SHA1(string content, string secretKey, bool raw_outut = false) { Encoding enc = Encoding.UTF8; HMACSHA1 hmacsha1 = new HMACSHA1(enc.Ge...
1 2 3 4 5 6
收藏数 114
精华内容 45
热门标签