Android中如何进行签名校验和完整性校验

本文详细介绍了在Android中如何进行签名校验和完整性校验,以防止应用被二次打包和盗版。首先,通过获取APK和keystore信息进行默认签名验证,然后演示如何使用不同keystore对APK重新签名。接着,通过比较不同keystore签名的MD5值进行防盗版验证,并在运行时进行签名校验。最后,提供了关键代码和参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

签名校验和完整性校验主要是针对于二次打包的检测防范措施,如果没有签名校验和完整性校验功能,应用可能被恶意攻击者二次打包,被盗版的风险大大增加,同时也可能进行任意代码修改。

针对上面的问题,这章我们就对我们的App进行运行时签名校验。

准备

项目代码
项目代码的主要实现类SignatureChecker,欢迎查看。

验证默认签名信息

1.获取应用的APK

  • 在编写好项目以后,我们通过点击build->build apk.
  • 文件在项目的app/build/outputs/apk/debug/app-debug.apk
    在这里插入图片描述

2. 获取调试应用的keystore

  • 打开finder程序,Go -> Home -> ./android/debug.keystore
    在这里插入图片描述
  • 签署您的应用
  • 使用keytool命令查看android模式调试debug.keystore的签名信息,默认密码为空
    在这里插入图片描述
    命令:keytool -list -v -keystore debug.keystore

3.信息对比

  • 检查apk文件中的签名信息
    在这里插入图片描述
    上面的检查命令:keytool -printcert -file CERT.RSA

  • 对比信息在这里插入图片描述
    在这里完全可以看出,我们的apk默认的是经过androidstudio的debug.keystore来签名过的APK。

对APK进行重新签名

创建两个keystore

  • 创建两个KeyStore分别命名keyStoreAkeyStoreB
    在这里插入图片描述
  • 创建一个未签名的Apk,命名为app-release-unsigned
    签名_生成未签名APK

对APK进行签名

  • 使用KeyStoreA文件对app-release-unsigned进行签名,签名后的APK为app-release-keystoreA
jarsigner -verbose -keystore /Users/martin/Downloads/newsign/keystore/keystoreA -signedjar /Users/martin/Downloads/newsign/des/app-release-keystoreA.apk /Users/martin/Downloads/newsign/src/app-release-unsigned.apk android
命令解析

jarsigner的参数说明

  • keystore 参数指定您的私钥的绝对路径,例如:/Users/martin/Downloads/newsign/keystore/keystoreA
  • signedjar 参数指定签名后apk文件存放绝对的路径,例如 /Users/martin/Downloads/newsign/des/app-release-keystoreA.apk
  • [未签名的文件路径] 指定要签名apk文件的绝对路径,也就是您从我们这里下载到的,例如 /Users/martin/Downloads/newsign/src/app-release-unsigned.apk
  • [您的证书名称] 是指您创建密钥时您设置的证书名称

PS:参考MAC对APK包进行重新签名

签名成功:
签名_keystoreA签名

删除APK的签名信息并重新打包

  • 解压app-release-keystoreA删除META-INFO文件夹下的三个文件

    • ANDROID.RSA
    • ANDROID.SF
    • MANIFEST.MF
      在这里插入图片描述
      注意:这里的三个文件的名称因为工具的原因可能会根据改变,我们删除的时候,看他的后缀名称就好。
  • 重新打包删除后的app-release-keystoreA文件,后缀名改为APK。
    签名_打包移动APK

  • 使用我们的keyStoreBapp-release-keystoreA进行重新签名,生成app-release-keystoreB

jarsigner -verbose -keystore /Users/martin/Downloads/newsign/keystore/keystoreB -signedjar /Users/martin/Downloads/newsign/des/app-release-keystoreB.apk /Users/martin/Downloads/newsign/src/app-release-keystoreA.apk androidx

签名_keystoreB签名

防止APP被盗版验证

KeyStoreA和KeyStoreB的签名MD5比较

  • 安装keystoreA签名过的APK文件。
adb install -r /Users/martin/Downloads/newsign/des/app-release-keystoreA.apk

生成MD5值:

8ad65c2224d9c303250c7c49a3672323
  • 修改签名,使用KeyStoreB重新签名
    命令:
adb install -r /Users/martin/Downloads/newsign/des/app-release-keystoreA.apk

生成MD5值:

8fe878055ba594ee41ba8a4b2e0ca3e5

签名_A和B的签名信息比较
注意:这里的MD5值不和KeyStore显示的格式一样,是因为我格式再次进行了MD5加密。

可以看出来,即使是同样的APK,但是使用不同的签名还是会出现不同的APK值。所以,我们可以在应用中做校验,当MD5值不一样时,就不是官方正版的APK了。</

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值