為什么要簽名:
通過代碼簽名,開發(fā)者可以標識應(yīng)用創(chuàng)作者并更新其應(yīng)用,而無需創(chuàng)建復(fù)雜的接口和權(quán)限。當(dāng)應(yīng)用(APK 文件)安裝到 Android 設(shè)備上時,軟件包管理器會驗證 APK 是否已經(jīng)過適當(dāng)簽名,如果該證書(或更準確地說,證書中的公鑰)與為設(shè)備上的任何其他 APK 簽名時使用的密鑰一致,那么這個新 APK 可以選擇在清單中指定它將與其他以類似方式簽名的 APK 共用一個 UID。在 Android 上,應(yīng)用簽名是將應(yīng)用放入其應(yīng)用沙盒的第一步。已簽名的應(yīng)用證書定義了哪個用戶 ID 與哪個應(yīng)用相關(guān)聯(lián);不同的應(yīng)用要以不同的用戶 ID 運行。應(yīng)用簽名可確保一個應(yīng)用無法訪問任何其他應(yīng)用,通過明確定義的 IPC 進行訪問時除外。
Android 平臺提供了一個可擴展的 DRM 框架,以便應(yīng)用根據(jù)與受版權(quán)保護的內(nèi)容相關(guān)的許可限制條件來管理這些內(nèi)容。DRM 框架支持多種 DRM 方案;設(shè)備具體支持哪些 DRM 方案由設(shè)備制造商決定。
DRM Framework API:通過 Android 應(yīng)用框架提供給應(yīng)用,并通過適用于標準應(yīng)用的 Dalvik VM 運行。
原生代碼 DRM 管理器:用于實現(xiàn) DRM 框架,并為 DRM 插件(代理)提供接口,以便處理各種 DRM 方案的版權(quán)管理和解密操作。
Android 現(xiàn)在已經(jīng)支持三種應(yīng)用簽名方案:
v1 方案:基于 JAR 簽名。
v2 方案:APK 簽名方案 v2,在 Android 7.0 引入。
v3 方案:APK 簽名方案v3,在 Android 9.0 引入。
v4 方案:APK 簽名方案v4,在Android11.0引入。
v1 → v2 是顛覆性的,為了解決 JAR 簽名方案的安全性問題,對開發(fā)者影響最大的,就是渠道簽署的問題。在當(dāng)下這個大環(huán)境下,我們想讓不同渠道、市場的安裝包有所區(qū)別,攜帶渠道的唯一標識,這就是我們俗稱的渠道包。好在各大廠都開源了自己的簽渠道方案,例如:Walle(美團)、VasDolly(騰訊)都是非常優(yōu)秀的方案。
v2 → v3 方案,其實結(jié)構(gòu)上并沒有太大的調(diào)整,可以理解為 v2 簽名方案的升級版,有一些資料也把它稱之為 v2+ 方案。因為這種簽名方案的升級,就是向下兼容的,所以只要使用得當(dāng),這個過程對開發(fā)者是透明的。
APK 簽名方案 v2 :
是一種全文件簽名方案,該方案能夠發(fā)現(xiàn)對 APK 的受保護部分進行的所有更改,從而有助于加快驗證速度并增強完整性保證。
使用 APK 簽名方案 v2 進行簽名時,會在 APK 文件中插入一個 APK 簽名分塊,該分塊位于“ZIP 中央目錄”部分之前并緊鄰該部分。在“APK 簽名分塊”內(nèi),v2 簽名和簽名者身份信息會存儲在 APK 簽名方案 v2 分塊中。
APK 簽名方案 v2 是在 Android 7.0 (Nougat) 中引入的。為了使 APK 可在 Android 6.0 (Marshmallow) 及更低版本的設(shè)備上安裝,應(yīng)先使用 JAR 簽名功能對 APK 進行簽名,然后再使用 v2 方案對其進行簽名。
APK 簽名方案 v3:
Android 9 支持 APK 密鑰輪替,這使應(yīng)用能夠在 APK 更新過程中更改其簽名密鑰。為了實現(xiàn)輪替,APK 必須指示新舊簽名密鑰之間的信任級別。為了支持密鑰輪替,我們將 APK 簽名方案從 v2 更新為 v3,以允許使用新舊密鑰。v3 在 APK 簽名分塊中添加了有關(guān)受支持的 SDK 版本和 proof-of-rotation 結(jié)構(gòu)的信息。
v3 方案的設(shè)計與 v2 方案非常相似,它們采用相同的常規(guī)格式,并支持相同的簽名算法 ID、密鑰大小和 EC 曲線。
但是,v3 方案增添了有關(guān)受支持的 SDK 版本和 proof-of-rotation 結(jié)構(gòu)的信息。
APK 簽名方案 v4:
Android 11 通過 APK 簽名方案 v4 支持與流式傳輸兼容的簽名方案。v4 簽名基于根據(jù) APK 的所有字節(jié)計算得出的 Merkle 哈希樹。它完全遵循 fs-verity 哈希樹的結(jié)構(gòu)(例如,對鹽進行零填充,以及對最后一個分塊進行零填充。)Android 11 將簽名存儲在單獨的 <apk name>.apk.idsig
文件中。v4 簽名需要 v2 或 v3 簽名作為補充。
運行 adb install --incremental 命令時,adb 會要求 .apk.idsig 文件存在于 .apk 旁邊,默認情況下,它還會使用 .idsig 文件嘗試進行增量安裝;如果此文件缺失或無效,該命令會回退到常規(guī)安裝。