APK签名

APK签名:
Android APK文件是Java JAR包格式的扩展,它使用的签名方法也是基于JAR签名。使用公钥加密和X.509证书。

APK签名的作用:
验证APK发行者的身份;保证APK未被篡改;防止交易中抵赖发生。

META-INF目录下包含三个文件:
MANIFEST.MF、CERT.SF、CERT.RSA。

MANIFEST.MF文件摘要如下:

该文件包含多个条目,每个条目的内容是压缩包内的每个文件的文件名和其对应的摘要值(对文件SHA-1并base64编码后的值)。

CERT.SF文件摘要如下:

该文件包含多个条目,除了包含每个文件及其摘要,还多了第一个条目,它是MANIFEST.MF文件的摘要。
使用OpenSLL命令验证如下:

CERT.RSA是签名块文件,其文件摘要如下:

签名工具:
官方JDK中JAR签名和验证的工具是jarsigner。
keystore的管理工具是keytool。
签名和验证分别如下:

说明下,Android 4.3后,已支持SHA-256和SHA-512。

验证过程:
首先验证签名块和签名证书(CERT.RSA),确认签名文件没有被篡改;
接着验证签名文件(CERT.SF)中的每个摘要,是否与MANIFEST.MF中的条目匹配;
最后验证MANIFEST.MF中调补,检查摘要与文件是否匹配。

查看APK签名信息:

提取APK签名证书:

Android提供的APK签名和验证的专用工具singapk。
signapk与jarsigner的区别:
jarsigner需要密钥存储在一个兼容的密钥仓库文件中。
signapk使用分离的一个签名密钥(DER编码的PKCS#8格式)和一个证书文件(DER编码的X.509格式)作为输入。

将OpenSSL密钥转换成PKCS#8格式:

使用signapk签名APK:

OTA包签名:
signapk可以使用-w选项开启”sign whole file”模式,除了对每个文件签名,还会产生整个压缩包的签名。
OTA包包含PEM格式的更新签名证书META-INF/com/android/otacert。
OTA信任证书与正常的系统信任存储是分离的,存储位置为/system/etc/security/otacerts.zip。

你可能感兴趣的:(Android)