本文来自刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主 ,引用必须注明出处!
签名机制:
V1:7.0以前默认,使用META-INF目录下三个文件,MANIFEST.MF,CERT.MF,CERT.RSA来保证apk不被修改。
MANIFEST.MF:记录apk资源中除META-INF,所有文件的Base64编码的SHA1值。防止apk资源被修改。
CERT.MF:记录MANIFEST.MF中属性值的Base64。防止MANIFEST.MF被修改。
CERT.RSA:记录通过开发者私钥对CERT.MF计算得到的签名,和开发者公钥。
解析过程是通过PackageManagerService.java和PackageParser.java对上述过程进行逆向操作。如果签名验证成功,则安装成功,否则安装失败。
V2:7.0以后默认此类型签名方式,如不处理安装时显示无证书。V1缺点在于,签名可以被清除,重新签名。
安装时,不用每次再去解压校验每个文件,只需要检验整个APK的数据摘要,发明SigningBlock插入apk修改偏移量满足zip结构要求。安装速度是V1的3倍左右。
将数据摘要、数字证书、额外属性组装成类MF文件
用私钥将MF计算得到类SF文件
将类MF文件和类SF文件,以及开发者公钥,用私钥签名成V2。
结构如下图:
V2严格限制apk不能被重新签名,否则已安装的apk,再替换安装时,检验不通过。
重签名:保证安装。环境:jdk1.8,据说jdk1.7要加入“-digestalg SHA1 -sigalg MD5withRSA”几个参数(未验证)
将apk解压,删除META-INF文件夹,重新压缩成zip格式。
v1:jarsigner -verbose -keystore “jks路径” -storepass “存储密码” -keypass “键密码” -signedjar “输出apk 路径” “转换apk路径” “alias 别名”