Android_签名

生成签名文件

  • 命令行
Android_签名_第1张图片
cmd_create.png

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
Android_签名_第2张图片
create_new_keystore.png

填写如下相关信息->finish


Android_签名_第3张图片
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
Android_签名_第4张图片
MANIFEST.MF.png

里面包含了所有apk中资源分别求Hash值

Android_签名_第5张图片
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体现在公钥一致。

你可能感兴趣的:(Android_签名)