android的簽名
❶ Android v1、v2、v3簽名詳解
了解 HTTPS 通信的同學都知道,在消息通信時,必須解決確保消息來源的真實性與消息完整性的問題。同理,在安裝 APK 時,也需要驗證 APK 來源的真實性,並確保 APK 未被第三方篡改。為此,Android 官方要求開發者進行簽名,即對 APK 進行加密。簽名涉及基本概念:消息摘要、數字簽名和數字證書。
消息摘要(Message Digest)是將消息數據通過單向哈希函數生成固定長度的哈希值,通常用於驗證數據完整性。SHA-256 是 SHA-1 的升級版,現在 Android 使用的默認演算法為 SHA-256。
數字簽名的作用包括:保證信息傳輸完整性、發送者身份認證與防止抵賴。它通過使用發送者的私鑰加密消息摘要,接收者則用對應公鑰解密並驗證消息完整性。RSA 是常見數字簽名方案,其流程為:使用私鑰加密消息摘要生成簽體,接收者用公鑰解密並驗證。
然而,數字簽名僅確保消息完整性,不保證保密性,且在消息長度較大時效率較低。因此,它通常與快速摘要演算法結合使用,構成有效的簽名方案。
數字證書用於保護公鑰安全可信,它包含公鑰擁有者信息及公鑰,遵循 X.509 標准。數字證書通過 CA 機構的簽名確保其可信度。數字證書結合數字簽名技術,用於確保公鑰的完整性與認證性。
Android 的打包流程包括:資源文件打包、aidl 文件處理、Java 代碼編譯、類文件轉換與 APK 打包等步驟。簽名發生在倒數第二步,針對已存在的 APK 文件,使用開發者自定義的 keystore 簽名。
Android 的應用簽名方案經歷了三代:v1(基於 JAR 簽名)、v2(APK 簽名方案,Android 7.0 引入)、v3(APK 簽名方案升級版,Android 9.0 引入)。v1 到 v2 是顛覆性的升級,主要解決 JAR 簽名方案的安全性問題。v3 為 v2 的升級版,結構上未做重大調整。
v1 到 v2 的升級引入了渠道簽署問題,為不同渠道安裝包提供區別。各大廠提供了開源簽渠道方案,如 Walle(美團)和 VasDolly(騰訊)。簽名工具有 jarsigner 和 apksigner,它們用於 APK 簽名,使用 keystore 文件和 pk8、x509.pem 文件。
簽名過程包括:選取簽名後的 APK,解壓後分析 MANIFEST.MF、CERT.SF、CERT.RSA 文件內容。MANIFEST.MF 文件記錄 APK 內容摘要,CERT.SF 文件記錄摘要的摘要,CERT.RSA 文件則記錄簽名信息。簽名驗證發生在安裝過程中,涉及三個步驟。
APK 簽名方案 v2(Android 7.0 引入)改進了 v1 的簽名校驗速度慢與可修改性問題。它全文件簽名,驗證所有位元組,確保 APK 的完整性與保護性。v3(Android 9.0 引入)在 v2 的基礎上新增新證書塊,記錄所有簽名信息,支持簽名的替換與升級。
總之,Android 簽名機制通過消息摘要、數字簽名與數字證書確保了消息與 APK 的完整性和安全性,同時引入了簽名驗證機制來保護用戶免受篡改與欺騙。簽名方案的升級逐漸改進了性能與安全性,確保了向下兼容性,為開發者提供了強大的安全框架。
❷ Android 端 V1/V2/V3 簽名的原理
Android 安裝包的簽名方案有三個版本,即 V1、V2 和 V3。接下來,我們詳細了解一下這些簽名的原理。
V1 簽名方案中,apk 是一個 zip 文件,解壓縮後,可以看到 META-INFO 文件夾中有 MANIFEST.MF、CERT.SF、CERT.RSA 三個文件。這三個文件在簽名時創建,在安裝時用於驗證簽名。MANIFEST.MF 文件記錄了 apk 中每個文件的摘要信息,防止文件被篡改。CERT.SF 文件記錄了 MANIFEST.MF 文件的摘要以及每個數據塊的摘要,以防止 MANIFEST.MF 被篡改。最後,CERT.RSA 文件包含了對 CERT.SF 文件的簽名和開發者證書,用於驗證 CERT.SF 文件未被篡改。
V1 的簽名機制包括以下步驟:計算每個原始文件的 SHA-1 摘要並寫入 MANIFEST.MF,計算整個 MANIFEST.MF 的摘要並寫入 CERT.SF,計算 MANIFEST.MF 中每一塊的摘要並寫入 CERT.SF,計算整個 CERT.SF 的摘要並使用開發者私鑰計算出摘要的簽名,然後將簽名和證書寫入 CERT.RSA。
V1 簽名的校驗流程如下:取出 CERT.RSA 中的開發者證書,通過系統根證書驗證證書可信度,用證書中的公鑰解密 CERT.RSA 中的簽名,計算 CERT.SF 的簽名,對比兩者的簽名是否一致,然後用 CERT.SF 驗證 MANIFEST.MF 是否被修改,最後用 MANIFEST.MF 中的數據驗證每個文件是否被修改。
V1 簽名能夠防止篡改,但存在校驗速度慢和完整性不足的問題。
V2 簽名方案在 Android 7.0 後引入,解決了 V1 簽名校驗速度慢的問題,並擴展了完整性的校驗至整個安裝包。V2 簽名時,在 zip 文件的「文件信息」和「中央目錄」之間插入簽名信息塊,按照 1MB 為單位計算摘要。V2 簽名的校驗流程包括判斷是否具有 V2 簽名,如有 V2 簽名,則不再驗證 V1 簽名。
V3 簽名方案與 V2 的簽名塊格式相同,但簽名信息存放在不同的數據塊中,允許更改 APK 的簽名。