签名
V1签名
签名原理
对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件:
MANIFEST.MF
NETEASE.RSA
NETEASE.SF
其中.RSA文件还可能是.DSA文件,RSA与SF文件的文件名可以更改,但是它们的命名必须一样。
MANIFEST.MF中保存了APK里所有文件的SHA1校验值的BASE64编码,格式如下(一个文件对应一条记录):
Name: res/anim/abc_fade_in.xml
SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI=
Name: res/anim/abc_fade_out.xml
SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ=
SF文件里保存了MANIFEST.MF文件的SHA1校验值的BASE64编码,同时还保存了MANIFEST.MF中每一条记录的SHA1检验值BASE64编码,格式如下:
SHA1-Digest-Manifest: ZRhh1HuaoEKMn6o21W1as0sMlaU=
Name: res/anim/abc_fade_in.xml
SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA=
Name: res/anim/abc_fade_out.xml
SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo=
RSA文件则包含了签名的公钥、签名所有者等信息,还保存了用SHA1withRSA签名算法对SF文件的签名结果信息。
Android系统就是根据这三个文件的内容对APK文件进行签名检验的。
签名方法
apksign
一般的签名过程可以由apksign.jar或者jarsinger.jar完成。apksign.jar由Android SDK提供,使用方法如下:
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
它接受一个PEM公钥文件,PK8私钥文件,对update.apk进行签名,签名后的文件保存到update_signed.apk。
jarsinger
jarsinger是由JDK提供,使用方法如下:
jarsigner -verbose -keystore d:\\debug.keystore -signedjar update_signed.apk update.apk androiddebugkey -digestalg SHA1 -sigalg MD5withRSA -keypass android -storepass android
V2签名
Android 7.0(Nougat)引入一项新的应用签名方案APK Signature Scheme v2(简称V2),它是一个对全文件进行签名的方案,能提供更快的应用安装时间、对未授权APK文件的更改提供更多保护,在默认情况下,Android Gradle 2.2.0插件会使用APK Signature Scheme v2和传统签名方案来签署应用。
目前该方案并不是强制方案,在build.gradle
添加v2SigningEnabled false
即可使用V1方案来签署应用,如下所示:
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFile file("releasekey.keystore")
storePassword "password"
keyAlias "ReleaseKeyAlias"
keyPassword "KeyPassword"
v2SigningEnabled false
}
}
}
使用V2签名进行签署的同时也会对A