應用程序簽名

應用程式簽名允許開發人員識別應用程式的作者並更新其應用程序,而無需創建複雜的介面和權限。每個在 Android 平台上運行的應用程式都必須由開發人員簽署。嘗試在未經簽署的情況下安裝的應用程式將被 Google Play 或 Android 裝置上的軟體包安裝程式拒絕。

在 Google Play 上,應用程式簽署連接了 Google 與開發者之間的信任以及開發者對其應用程式的信任。開發人員知道他們的應用程式是未經修改地提供給 Android 裝置的;開發人員可以對其應用程式的行為負責。

在 Android 上,應用程式簽名是將應用程式放入應用程式沙箱的第一步。簽署的應用程式憑證定義了哪個使用者 ID 與哪個應用程式關聯;不同的應用程式在不同的使用者 ID 下運作。應用程式簽名可確保一個應用程式無法存取任何其他應用程序,除非透過明確定義的 IPC。

當應用程式(APK 檔案)安裝到 Android 裝置上時,套件管理員會驗證 APK 是否已使用該 APK 中包含的憑證正確簽署。如果憑證(或更準確地說,憑證中的公鑰)與用於簽署裝置上任何其他 APK 的金鑰匹配,則新 APK 可以選擇在清單中指定它將與其他 APK 共用 UID,類似地-簽名的APK。

應用程式可以由第三方(OEM、運營商、替代市場)簽署或自簽署。 Android 使用自簽名憑證提供程式碼簽名,開發人員無需外部協助或許可即可產生這些憑證。申請不必由中央機構簽署。 Android 目前不會對應用程式憑證進行 CA 驗證。

應用程式還能夠在簽名保護層級聲明安全權限,限制僅存取使用相同金鑰簽署的應用程序,同時維護不同的 UID 和應用程式沙箱。使用共用 UID 功能可以與共用應用程式沙箱建立更密切的關係,其中使用同一開發人員金鑰簽署的兩個或多個應用程式可以在其清單中聲明共用 UID。

APK簽章方案

Android 支援三種應用程式簽章方案:

為了獲得最大的相容性,請使用所有方案對應用程式進行簽名,首先使用 v1,然後使用 v2,最後使用 v3。 Android 7.0+ 及更高版本的裝置安裝使用 v2+ 方案簽署的應用程式比僅使用 v1 方案簽署的應用程式更快。較舊的 Android 平台會忽略 v2+ 簽名,因此需要應用程式包含 v1 簽名。

JAR 簽章(v1 方案)

APK 簽章從一開始就是 Android 的一部分。它基於簽署的 JAR 。有關使用此方案的詳細信息,請參閱 Android Studio 文件中的對應用程式進行簽名

v1 簽章不會保護 APK 的某些部分,例如 ZIP 元資料。 APK驗證者需要處理大量不受信任(尚未驗證)的資料結構,然後丟棄簽名未涵蓋的資料。這提供了相當大的攻擊面。此外,APK驗證器必須解壓縮所有壓縮條目,消耗更多的時間和記憶體。為了解決這些問題,Android 7.0引進了APK簽章方案v2。

APK簽章方案v2和v3(v2+方案)

運行Android 7.0及更高版本的設備支援APK簽章方案v2(v2方案)及更高版本。 (v2 方案在Android 9 中更新為v3,以在簽名區塊中包含附加信息,但其他方面的工作原理相同。)APK 的內容經過哈希處理和簽名,然後將生成的APK 簽名區塊插入到APK 中。有關將 v2+ 方案應用於應用的詳細信息,請參閱APK 簽名方案 v2

在驗證過程中,v2+ 方案將 APK 檔案視為 blob,並對整個檔案執行簽名檢查。對 APK 的任何修改(包括 ZIP 元資料修改)都會使 APK 簽章失效。這種形式的 APK 驗證速度明顯更快,並且能夠偵測更多類別的未經授權的修改。

新格式向後相容,因此使用新簽章格式簽署的 APK 可以安裝在較舊的 Android 裝置上(它會忽略新增到 APK 中的額外資料),只要這些 APK 也是 v1 簽署的。

APK簽名驗證流程

圖1. APK簽名驗證流程

APK 的整個檔案雜湊值將根據 APK 簽章區塊中儲存的 v2+ 簽章進行驗證。哈希涵蓋了除 APK 簽名區塊之外的所有內容,其中包含 v2+ 簽名。在 APK 簽章區塊之外對 APK 進行的任何修改都會使 APK 的 v2+ 簽章失效。帶有剝離 v2+ 簽章的 APK 也會被拒絕,因為它們的 v1 簽章指定 APK 是 v2 簽章的,這使得 Android 7.0 及更高版本拒絕使用其 v1 簽章來驗證 APK。

有關APK簽章驗證流程的詳細信息,請參閱APK簽章方案v2的驗證部分