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 应用发布流程中,APK 签名是关键的一环,用于验证应用作者身份并确保应用数据的完整性和一致性。以下是 APK 签名的主要方法和流程: ### APK 签名的基本概念 APK 签名通过使用密钥库(keystore)文件对 APK 进行数字签名,通常采用 Java 的 `keytool` 和 `jarsigner` 工具,或者使用 Android 提供的 `apksigner` 工具进行签名操作。签名过程生成的签名信息被嵌入到 APK 文件的 `META-INF` 目录中,包括签名证书和加密摘要。 ### 使用密钥库(Keystore)创建签名 开发者首先需要生成一个密钥库文件(通常为 `.jks` 扩展名),其中包含私钥和公钥证书。使用 `keytool` 命令可以生成密钥库: ```bash keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias ``` 该命令会提示用户输入密钥库密码、密钥密码以及证书相关信息,最终生成一个包含密钥的 `.jks` 文件[^2]。 ### 使用 `jarsigner` 进行签名 在生成未签名APK 文件后(通常通过 Android Studio 或构建工具生成),可以使用 `jarsigner` 工具进行签名: ```bash jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.jks app-release-unsigned.apk my-alias ``` 此命令将使用指定的密钥库和别名对 APK 文件进行签名签名完成后,可以使用 `zipalign` 工具优化 APK 文件以提高运行效率: ```bash zipalign -v 4 app-release-unsigned.apk app-release.apk ``` ### 使用 `apksigner` 进行签名 `apksigner` 是 Android 提供的专用签名工具,支持 V1 和 V2 签名方案,适用于 Android 7.0(API 24)及以上版本。其使用方式如下: ```bash apksigner sign --ks my-release-key.jks --out app-release-signed.apk app-release-unsigned.apk ``` 该命令会使用指定的密钥库对 APK 文件进行签名,并输出已签名APK 文件。同时,`apksigner` 还支持多签名方案,可以确保 APK 在不同设备上兼容。 ### APK 签名验证 签名完成后,可以通过以下命令验证 APK 是否已正确签名: ```bash apksigner verify app-release-signed.apk ``` 该命令将输出签名信息,包括签名方案、证书指纹等,确保 APK 文件的完整性和签名有效性[^3]。 ### 签名流程总结 1. **生成密钥库**:使用 `keytool` 创建 `.jks` 文件。 2. **编译未签名 APK**:通过 Android 构建工具生成未签名APK 文件。 3. **签名 APK**:使用 `jarsigner` 或 `apksigner` 对 APK 文件进行签名。 4. **优化 APK**:使用 `zipalign` 工具优化 APK 文件。 5. **验证签名**:使用 `apksigner verify` 命令确保签名有效。 在整个签名流程中,确保密钥库文件的安全性至关重要,一旦密钥丢失,将无法更新已发布的应用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值