第十一章 软件保护技术(四)(完整性校验)

文章目录

  • 完整性校验

完整性校验

  • 每个软件发布时都要由开发人员签名,签名时用的密钥文件为其独有,破解者不可能拥有相同的密钥文件(除非被盗),因此证书签名信息成为 Android 软件的一种有效身份标识,若软件运行时的签名和发布时的不同,说明软件被篡改,可中止运行

  • Android SDK 提供检测软件签名的方法,可调用 PackageManager 类的 getPackageInfo(),为第二个参数传入 PackageManager.GET_SIGNATURES,返回的 PackageInfo 对象的 signatures 字段就是软件发布时的签名,但此签名内容较长,不适合在代码中比较,因此可计算签名对象的 MD5 值,在代码中比较

  • 实例代码:

    private boolean checkSign() {
        try {
            PackageInfo packageInfo = this.getPackageManager().
                getPackageInfo("com.droider.checksignature", PackageManager.GET_SIGNATURES);
            Signature[] signatures = packageInfo.signatures;
            String sign = signatureMD5(signatures);
            return sign.equals("B68FB5DAC21679C3D37EAE8C6F9F87D5");
        }
        catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }
    
  • 这里要先将 APK 签名信息的 MD5 值计算出,再将该值和实际计算出的 MD5 值比较

  • 这里用的签名证书的 keystore 为 androidbook.jks,可执行 keytool(jdk 提供)命令查看 androidbook.jks 中证书的签名信息

    image-20200423224524870

  • 在实际的项目开发中,用 Java 层的 API 计算签名信息,不仅易被检测出,还易被绕过,更合理的方法是将用于计算 MD5 值得代码放在 Native 层,用 JNI 方法或原生的函数计算

你可能感兴趣的:(第十一章 软件保护技术(四)(完整性校验))