Android中APK签名工具之jarsigner和apksigner详解
一.工具介绍
jarsigner是JDK提供的针对jar包签名的通用工具,
位于JDK/bin/jarsigner.exe
apksigner是Google官方提供的针对Androidapk签名及验证的专用工具,
位于AndroidSDK/build-tools/SDK版本/apksigner.bat
不管是apk包,还是jar包,本质都是zip格式的压缩包,所以它们的签名过程都差不多(仅限V1签名),
以上两个工具都可以对Androidapk包进行签名.
1.V1和V2签名的区别
在AndroidStudio中点击菜单Build->Generatesignedapk...打包签名过程中,
可以看到两种签名选项V1(JarSignature) V2(FullAPKSignature),
刚开始升级AS看到这个懵了,既然是APKSignature,就放心偷懒选了V2,结果安装失败???无奈,只能查资料...
从Android7.0开始,谷歌增加新签名方案V2Scheme(APKSignature);
但Android7.0以下版本,只能用旧签名方案V1scheme(JARsigning)
V1签名:
- 来自JDK(jarsigner),对zip压缩包的每个文件进行验证,签名后还能对压缩包修改(移动/重新压缩文件)
- 对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF,CERT.SF,CERT.RSA),
- 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件),由此可知:V1签名是对压缩包中单个文件签名验证
V2签名:
- 来自Google(apksigner),对zip压缩包的整个文件验证,签名后不能修改压缩包(包括zipalign),
- 对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效,由此可知:V2签名是对整个APK签名验证
V2签名优点很明显:
- 签名更安全(不能修改压缩包)
- 签名验证时间更短(不需要解压验证),因而安装速度加快
注意:apksigner工具默认同时使用V1和V2签名,以兼容Android7.0以下版本
2.zipalign和V2签名
位于AndroidSDK/build-tools/SDK版本/zipalign.exe
zipalign是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗
zipalign-v4in.apkout.apk//4字节对齐优化 zipalign-c-v4in.apk//检查APK是否对齐
zipalign可以在V1签名后执行
但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!
二.签名步骤
1.生成密钥对(已有密钥库,可忽略)
Eclipse或AndroidStudio在Debug时,对App签名都会使用一个默认的密钥库:
- 默认在C:\Users\用户名\.android\debug.keystore
- 密钥库名: debug.keystore
- 密钥别名: androiddebugkey
- 密钥库密码:android
1.生成密钥对
进入JDK/bin,输入命令
keytool-genkeypair-keystore密钥库名-alias密钥别名-validity天数-keyalgRSA
参数:
-genkeypair 生成一条密钥对(由私钥和公钥组成)
-keystore 密钥库名字以及存储位置(默认当前目录)
-alias 密钥对的别名(密钥库可以存在多个密钥对,用于区分不同密钥对)
-validity 密钥对的有效期(单位:天)
-keyalg 生成密钥对的算法(常用RSA/DSA,DSA只用于签名,默认采用DSA)
-delete 删除一条密钥
提示:可重复使用此条命令,在同一密钥库中创建多条密钥对
例如:
在debug.keystore中新增一对密钥,别名是release
keytool-genkeypair-keystoredebug.keystore-aliasrelease-validity30000
2.查看密钥库
进入JDK/bin,输入命令
keytool-list-v-keystore密钥库名
参数:
-list查看密钥列表
-v 查看密钥详情
例如:
keytool-list-v-keystoredebug.keystore
现在debug.keystore密钥库中有两对密钥,别名分别是androiddebugkeyrelease
2.签名
1.方法一(jarsigner,只支持V1签名)
进入JDK/bin,输入命令
jarsigner-keystore密钥库名xxx.apk密钥别名
从JDK7开始,jarsigner默认算法是SHA256,但Android4.2以下不支持该算法,
所以需要修改算法,添加参数-digestalgSHA1-sigalgSHA1withRSA
jarsigner-keystore密钥库名-digestalgSHA1-sigalgSHA1withRSAxxx.apk密钥别名
参数:
-digestalg 摘要算法
-sigalg 签名算法
例如:
用JDK7及以上jarsigner签名,不支持Android4.2以下
jarsigner-keystoredebug.keystoreMyApp.apkandroiddebugkey
用JDK7及以上jarsigner签名,兼容Android4.2以下
jarsigner-keystoredebug.keystore-digestalgSHA1-sigalgSHA1withRSAMyApp.apkandroiddebugkey
2.方法二(apksigner,默认同时使用V1和V2签名)
进入AndroidSDK/build-tools/SDK版本,输入命令
apksignersign--ks密钥库名--ks-key-alias密钥别名xxx.apk
若密钥库中有多个密钥对,则必须指定密钥别名
apksignersign--ks密钥库名--ks-key-alias密钥别名xxx.apk
禁用V2签名
apksignersign--v2-signing-enabledfalse--ks密钥库名xxx.apk
参数:
--ks-key-alias 密钥别名,若密钥库有一个密钥对,则可省略,反之必选
--v1-signing-enabled是否开启V1签名,默认开启
--v2-signing-enabled是否开启V2签名,默认开启
例如:
在debug.keystore密钥库只有一个密钥对
apksignersign--ksdebug.keystoreMyApp.apk
在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名
apksignersign--ksdebug.keystore--ks-key-aliasandroiddebugkeyMyApp.apk
3.签名验证
1.方法一(keytool,只支持V1签名校验)
进入JDK/bin,输入命令
keytool-printcert-jarfileMyApp.apk(显示签名证书信息)
参数:
-printcert 打印证书内容
-jarfile已签名的jar文件或apk文件
2.方法二(apksigner,支持V1和V2签名校验)
进入AndroidSDK/build-tools/SDK版本,输入命令
apksignerverify-v--print-certsxxx.apk
参数:
-v,--verbose显示详情(显示是否使用V1和V2签名)
--print-certs显示签名证书信息
例如:
apksignerverify-vMyApp.apk
Verifies
Verifiedusingv1scheme(JARsigning):true
Verifiedusingv2scheme(APKSignatureSchemev2):true
Numberofsigners:1
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。