签名
在Android反编译的那些事[工具篇]中我介绍了下如何使用jarsigner对apk进行签名。不过这种签名仅对于v1签名有效,v2签名,我们则需要使用Google提供的apksigner.jar
工具
jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具, 位于Android SDK/build-tools/SDK版本/lib/apksigner.jar
jarsigner只能打v1包,apksigner默认支持v1、v2
V1和V2签名的区别
从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature); 但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing) 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签名,以兼容Android 7.0以下版本
只设置V2签名7.0以下会直接安装完显示未安装,报错信息为:INSTALL_PARSE_FAILED_NO_CERTIFICATES。7.0以上则使用了V2的方式验证,安装ok
同时设置V1和V2则所有机型都没问题,7.0以下使用v1,7.0以上使用v2
只设置v1签名并不会影响什么,但是在7.0上只使用v1验证,不会使用v2
工具的使用
在Android反编译的那些事[工具篇]中已经介绍了如何使用jarsigner,下面就来介绍如何使用apksigner
对应用进行签名
apksigner sign --ks release.jks app.apk
如果jks文件中不止一条签名信息,那么我们需要指定签名信息的name
apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk
验证签名信息
apksigner verify --verbose app.apk
禁用v1、v2签名,默认v1、v2都支持
apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk --v1-signing-enabled 是否开启V1签名,默认开启 --v2-signing-enabled 是否开启V2签名,默认开启
需要注意的是,使用了v2签名则不能再修改apk文件,4k对齐也不可以。
参考博客:https://blog.csdn.net/qq_32115439/article/details/55520012