美文网首页
autojs用签名校验保护app

autojs用签名校验保护app

作者: 牙叔教程 | 来源:发表于2021-08-20 18:43 被阅读0次

    牙叔教程 简单易懂

    测试环境

    Autojs版本: 9.0.4
    Android版本: 8.0.0
    Android Studio版本: 4.1.2

    签名概念

    目的: 为了确认某个信息确实是由某个发送方发送的,或者某个发布内容确实是由发送方发布的,任何人都不可能伪造消息,并且,发送方也不能抵赖。
    方法: 对发布的信息内容,通过某种可靠的加工(比如进行MD5运算),生成签名标识(字符串序列或者证书之类)
    验证: 任何人拿到发布的信息内容后,可以通过同样的加工,得出签名标识,如果比对和发布者公布的签名一致,则验证为真。
    签名与加密区别: 加密是为了不让别人知道原来的信息,签名是为了保证大家获取到的原来的信息是没有经过改动的。

    签名校验

    Android中的每个应用都是有一个唯一的签名, 一个应用没有被签名是不允许安装到设备中的,

    APP签名校验,主要作用是保护APP本身的安全利益,防止被违法分子进行内部代码和文件修改,然后插入广告等获利行为,进行违法操作。

    校验方法

    • Java层入口校验
    • NDK校验, 即so文件
    • 服务器验证

    autojs的签名管理

    使用autojs打包脚本的时候, 最下方有一个签名选项, 可以选择签名,
    签名文件后缀是jks, 创建的签名默认保存在
    /sdcard/.keystore/

    签名的时候, 我们可以选择自己创建的签名,
    执行脚本的时候, 先校验签名, 不一样的话就退出脚本

    通过jks文件获取签名的sha1值

    android studio 中有一个keytool, 执行以下命令即可获取签名的sha1
    keytool -list -v -keystore yashu.jks

    获取签名的sha1.png

    代码讲解

    1. 导入类
    importClass(android.content.pm.PackageManager);
    importClass(java.security.MessageDigest);
    importClass(java.io.ByteArrayInputStream);
    importClass(java.lang.StringBuilder);
    importClass(java.lang.Integer);
    importClass(java.security.cert.CertificateFactory);
    
    2. 获取应用的签名sha1
    /**
     * 获取应用的签名
     */
    function getCertificateSHA1Fingerprint() {
      //获取包管理器
      let pm = context.getPackageManager();
    
      //获取当前要获取 SHA1 值的包名,也可以用其他的包名,但需要注意,
      //在用其他包名的前提是,此方法传递的参数 Context 应该是对应包的上下文。
      let packageName = context.getPackageName();
    
      //返回包括在包中的签名信息
      let flags = PackageManager.GET_SIGNATURES;
    
      //获得包的所有内容信息类
      let packageInfo = pm.getPackageInfo(packageName, flags);
    
      //签名信息
      let signatures = packageInfo.signatures;
      let cert = signatures[0].toByteArray();
    
      //将签名转换为字节数组流
      let input = new ByteArrayInputStream(cert);
    
      //证书工厂类,这个类实现了出厂合格证算法的功能
      let cf = CertificateFactory.getInstance("X509");
    
      //X509 证书,X.509 是一种非常通用的证书格式
      let c = cf.generateCertificate(input);
    
      //加密算法的类,这里的参数可以使 MD4,MD5 等加密算法
      let md = MessageDigest.getInstance("SHA1");
    
      //获得公钥
      let publicKey = md.digest(c.getEncoded());
    
      //字节到十六进制的格式转换
      let hexString = byte2HexFormatted(publicKey);
    
      return hexString;
    }
    
    //这里是将获取到得编码进行16 进制转换
    function byte2HexFormatted(arr) {
      let str = new StringBuilder(arr.length * 2);
    
      for (let i = 0; i < arr.length; i++) {
        let h = Integer.toHexString(arr[i]);
        let l = h.length;
        if (l == 1) h = "0" + h;
        if (l > 2) h = h.substring(l - 2, l);
        str.append(h.toUpperCase());
        if (i < arr.length - 1) str.append(":");
      }
      return str.toString();
    }
    

    参考

    Android App运行时签名校验
    各种签名(signature)和校验
    签名校验破解过程

    名人名言

    思路是最重要的, 其他的百度, bing, stackoverflow, 安卓文档, autojs文档, 最后才是群里问问
    --- 牙叔教程

    声明

    部分内容来自网络
    本教程仅用于学习, 禁止用于其他用途

    相关文章

      网友评论

          本文标题:autojs用签名校验保护app

          本文链接:https://www.haomeiwen.com/subject/ynotiltx.html