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