前言
签名校验和完整性校验主要是针对于二次打包的检测防范措施,如果没有签名校验和完整性校验功能,应用可能被恶意攻击者二次打包,被盗版的风险大大增加,同时也可能进行任意代码修改。
针对上面的问题,这章我们就对我们的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分别命名
keyStoreA和keyStoreB

- 创建一个未签名的Apk,命名为
app-release-unsigned

对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包进行重新签名
签名成功:

删除APK的签名信息并重新打包
-
解压
app-release-keystoreA删除META-INFO文件夹下的三个文件- ANDROID.RSA
- ANDROID.SF
- MANIFEST.MF

注意:这里的三个文件的名称因为工具的原因可能会根据改变,我们删除的时候,看他的后缀名称就好。
-
重新打包删除后的
app-release-keystoreA文件,后缀名改为APK。

-
使用我们的
keyStoreB对app-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

防止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

注意:这里的MD5值不和KeyStore显示的格式一样,是因为我格式再次进行了MD5加密。
可以看出来,即使是同样的APK,但是使用不同的签名还是会出现不同的APK值。所以,我们可以在应用中做校验,当MD5值不一样时,就不是官方正版的APK了。</

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

被折叠的 条评论
为什么被折叠?



