细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4
目錄
簡介
APK v1
APK?v2
APK v3
APK v4
總結
簡介
大部分開發(fā)者對apk簽名還停留在APK v2,對APK v3和APK v4了解很少,而且網(wǎng)上大部分文章講解的含糊不清,所以根據(jù)官網(wǎng)文檔重新整理一份。
apk簽名從APK v1到APK v2改動很大,是顛覆性的,而APK v3只是對APK v2的一次升級,APK v4則是一個補充。
本篇文章主要參考Android各版本改動:
https://developer.android.google.cn/about/versions/pie/
APK v1
就是jar簽名,apk最初的簽名方式,大家都很熟悉了,簽名完之后是META-INF 目錄下的三個文件:MANIFEST.MF、CERT.SF、CERT.RSA。
MANIFEST.MF中是apk種每個文件名稱和摘要SHA1(或者 SHA256),如果是目錄則只有名稱
CERT.SF則是對MANIFEST.MF的摘要,包括三個部分:
-
SHA1-Digest-Manifest-Main-Attributes:對 MANIFEST.MF 頭部的塊做 SHA1(或者SHA256)后再用 Base64 編碼
-
SHA1-Digest-Manifest:對整個 MANIFEST.MF 文件做 SHA1(或者 SHA256)后再用 Base64 編碼
-
SHA1-Digest:對 MANIFEST.MF 的各個條目做 SHA1(或者 SHA256)后再用 Base64 編碼
CERT.RSA是將CERT.SF通過私鑰簽名,然后將簽名以及包含公鑰信息的數(shù)字證書一同寫入 CERT.RSA 中保存
通過這三層校驗來確保apk中的每個文件都不被改動。
APK?v2
官方說明:https://source.android.google.cn/security/apksigning/v2
APK 簽名方案 v2 是在 Android 7.0 (Nougat) 中引入的。為了使 APK 可在 Android 6.0 (Marshmallow) 及更低版本的設備上安裝,應先使用 JAR 簽名功能對 APK 進行簽名,然后再使用 v2 方案對其進行簽名。
APK v1的缺點就是META-INF目錄下的文件并不在校驗范圍內,所以之前多渠道打包等都是通過在這個目錄下添加文件來實現(xiàn)的。
APK 簽名方案 v2 是一種全文件簽名方案,該方案能夠發(fā)現(xiàn)對 APK 的受保護部分進行的所有更改,從而有助于加快驗證速度并增強完整性保證。
使用 APK 簽名方案 v2 進行簽名時,會在 APK 文件中插入一個 APK 簽名分塊,該分塊位于“ZIP 中央目錄”部分之前并緊鄰該部分。在“APK 簽名分塊”內,v2 簽名和簽名者身份信息會存儲在 APK 簽名方案 v2 分塊中。
通俗點說就是簽名信息不再以文件的形式存儲,而是將其轉成二進制數(shù)據(jù)直接寫在apk文件中,這樣就避免了APK v1的META-INF目錄的問題。
在 Android 7.0 及更高版本中,可以根據(jù) APK 簽名方案 v2+ 或 JAR 簽名(v1 方案)驗證 APK。更低版本的平臺會忽略 v2 簽名,僅驗證 v1 簽名。
APK v3
官方說明:https://source.android.google.cn/security/apksigning/v3
APK 簽名方案 v3 是在 Android 9 中引入的。
Android 9 支持 APK 密鑰輪替,這使應用能夠在 APK 更新過程中更改其簽名密鑰。為了實現(xiàn)輪替,APK 必須指示新舊簽名密鑰之間的信任級別。為了支持密鑰輪替,我們將 APK 簽名方案從 v2 更新為 v3,以允許使用新舊密鑰。v3 在 APK 簽名分塊中添加了有關受支持的 SDK 版本和 proof-of-rotation 結構的信息。
簡單來說APK v3就是為了Andorid9的APK 密鑰輪替功能而出現(xiàn)的,就是在v2的基礎上增加兩個數(shù)據(jù)塊來存儲APK 密鑰輪替所需要的一些信息,所以可以看成是v2的升級。具體結構見官網(wǎng)說明即可。
APK 密鑰輪替功能可以參考:https://developer.android.google.cn/about/versions/pie/android-9.0
具有密鑰輪轉的 APK 簽名方案
Android 9 新增了對 APK Signature Scheme v3 的支持。該架構提供的選擇可以在其簽名塊中為每個簽名證書加入一條輪轉證據(jù)記錄。利用此功能,應用可以通過將 APK 文件過去的簽名證書鏈接到現(xiàn)在簽署應用時使用的證書,從而使用新簽名證書來簽署應用。
https://developer.android.google.cn/about/versions/pie/android-9.0
注:運行 Android 8.1(API 級別 27)或更低版本的設備不支持更改簽名證書。如果應用的 minSdkVersion 為 27 或更低,除了新簽名之外,可使用舊簽名證書來簽署應用。
詳細了解如何使用 apksigner 輪轉密鑰參考:https://developer.android.google.cn/studio/command-line/apksigner#usage-rotate
在 Android 9 及更高版本中,可以根據(jù) APK 簽名方案 v3、v2 或 v1 驗證 APK。較舊的平臺會忽略 v3 簽名而嘗試驗證 v2 簽名,然后嘗試驗證 v1 簽名。
APK v4
官方說明:https://source.android.google.cn/security/apksigning/v4
APK 簽名方案 v4 是在 Android 11 中引入的。
Android 11 通過 APK 簽名方案 v4 支持與流式傳輸兼容的簽名方案。v4 簽名基于根據(jù) APK 的所有字節(jié)計算得出的 Merkle 哈希樹。它完全遵循 fs-verity 哈希樹的結構(例如,對salt進行零填充,以及對最后一個分塊進行零填充。)Android 11 將簽名存儲在單獨的 .apk.idsig 文件中。v4 簽名需要 v2 或 v3 簽名作為補充。
APK v4同樣是為了新功能而出現(xiàn)的,這個新功能就是ADB 增量 APK 安裝,可以參考Android11 功能和 API 概覽:
https://developer.android.google.cn/about/versions/11/features
ADB 增量 APK 安裝
在設備上安裝大型(2GB 以上)APK 可能需要很長的時間,即使應用只是稍作更改也是如此。ADB(Android 調試橋)增量 APK 安裝可以安裝足夠的 APK 以啟動應用,同時在后臺流式傳輸剩余數(shù)據(jù),從而加速這一過程。如果設備支持該功能,并且您安裝了最新的 SDK 平臺工具,adb install 將自動使用此功能。如果不支持,系統(tǒng)會自動使用默認安裝方法。
https://developer.android.google.cn/about/versions/11/features
運行以下 adb 命令以使用該功能。如果設備不支持增量安裝,該命令將會失敗并輸出詳細的解釋。
adb install --incremental
在運行 ADB 增量 APK 安裝之前,您必須先為 APK 簽名并創(chuàng)建一個 APK 簽名方案 v4 文件。必須將 v4 簽名文件放在 APK 旁邊,才能使此功能正常運行。
https://developer.android.google.cn/about/versions/11/features
因為需要流式傳輸,所以需要將文件分塊,對每一塊進行簽名以便校驗,使用的方式就是Merkle 哈希樹(https://www.kernel.org/doc/html/latest/filesystems/fsverity.html#merkle-tree),APK v4就是做這部分功能的。所以APK v4與APK v2或APK v3可以算是并行的,所以APK v4簽名后還需要 v2 或 v3 簽名作為補充。
運行 adb install --incremental 命令時,adb 會要求 .apk.idsig 文件存在于 .apk 旁邊(所以APK v4的簽名文件.apk.idsig并不會打包進apk文件中)
默認情況下,它還會使用 .idsig 文件嘗試進行增量安裝;如果此文件缺失或無效,該命令會回退到常規(guī)安裝。
總結
總結
以上是生活随笔為你收集整理的细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter漫说:组件生命周期、Sta
- 下一篇: Android App Bundle:动