【转】Android签名的一些事

/ 0评 / 34

签名

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注