生成签名文件
- 命令行
keytool工具是Java JDK自带的证书工具
-genkey参数表示:要生成一个证书(版权、身份识别的安全证书)
-alias参数表示:证书有别名,-alias test 表示证书别名为test
-keyalg RSA表示加密类型,RSA表示需要加密,以防止别人盗取
-validity 2000表示有效时间2000天
-keystore test表示要生成的证书名称为test
生成的数字证书test里面包换了非对称加密的私钥、公钥和证书。
- eclipse
选中任意一个工程,右键->Android tools->Export Signed Application Package
填写如下相关信息->finish
createpng
进行签名
jarsigner -verbose -keystore test -storepass 123456 -signedjar game\dist\game_signed.apk game\dist\game.apk test
jarsigner是Java的签名工具
-verbose参数表示:显示出签名详细信息
-keystore表示使用当前目录中的android123.keystore签名证书文件。
-signedjar game_signed.apk表示签名后生成的APK名称,game.apk表示未签名的APK Android软件, android.keystore表示别名
签名后的apk最好做一次4自己对齐操作
zipalign -f 4 game\dist\game_signed.apk apks\game\game_packed.apk
签名后解开apk文件里面会多了META-INT文件夹
meta-inf.png MANIFEST.MF.png里面包含了所有apk中资源分别求Hash值
TEST.SF.png首先对MANIFEST.MF整个文件求Hash值存放在SHA1-Digest-Manifest中,然后再对MANIFEST.MF里面的Hash值再求Hash值。
CERT.RSA保存加密后的信息,非对称加密的公钥,发行者名称和主体名称,生效日期和终止日期等
签名的作用
- 保证内容的完整性
在安装APK时,计算APK中每个资源的Hash值与MANIFEST.MF里面的Hash值做对比;如果成功,再计算MANIFEST.MF文件的Hash值与CERT.SF的Hash值做对比;如果成功,使用公钥解密CERT.RSA已加密的Hash值,然后与对CERT.SF文件求出的Hash值做对比;如果成功,表示验证通过。
如果恶意修改代码,再恶意修改MANIFEST.MF对应的Hash值,再恶意修改CERT.SF的Hash值,但是最后无法修改CERT.RSA里面的Hash值,因为没有私钥。
1)如果当前的APK被篡改,直接放入手机中运行,第一步在计算APK中每个资源的Hash值与MANIFEST.MF里面的Hash值做对比,这一步就Failed了。
2)如果当前的APK被篡改后重新签名,由于系统中原有同样包名的apk,发现与原有签名的公钥不一致,直接被reject。除非把原应用删除,再安装新的应用。 - shareUid
如果两个应用shareUid,说明两个应用可以对对方的私有目录进行访问,这就造成了安全隐患。如果360和QQ,sharedUid,那么360就可以访问QQ目录下(/data/data/com.tencent/...)的私有数据。所以我们规定shardUid的两个应用必须使用同样的私钥进行签名,在CERT.RSA体现在公钥一致。
网友评论