應用程式簽署

應用程式簽署功能可讓開發人員識別應用程式的作者,並更新應用程式,而無須建立複雜的介面和權限。在 Android 平台上執行的每個應用程式都必須由 開發人員簽署。如果應用程式嘗試在未簽署的情況下安裝,Google Play 或 Android 裝置上的套件安裝程式會拒絕安裝。

在 Google Play 中,應用程式簽署會連結 Google 與開發人員的信任,以及開發人員對應用程式的信任。開發人員知道應用程式是向 Android 裝置提供、未經修改,且開發人員可以對自己的應用程式行為負責。

在 Android 上,應用程式簽署是將應用程式放入應用程式沙箱的第一步。已簽署的應用程式憑證會定義哪些使用者 ID 與哪些應用程式相關聯;不同的應用程式會在不同的使用者 ID 下執行。應用程式簽署可確保除了明確定義的處理序間通訊 (IPC) 以外,應用程式無法存取任何其他應用程式。

當應用程式 (APK 檔案) 安裝到 Android 裝置上時,套件管理工具會驗證 APK 是否已使用 APK 中包含的憑證正確簽署。如果憑證 (或更準確地說,憑證中的公開金鑰) 與用於在裝置上簽署任何其他 APK 的金鑰相符,新 APK 可在資訊清單中指定它與其他同樣簽署的 APK 共用 UID。

應用程式可以由第三方 (原始設備製造商、電信業者、其他市場) 或自行簽署。Android 會使用自行簽署的憑證提供程式碼簽署,開發人員不需要外部協助或權限就能產生程式碼。應用程式不一定要經過中央主管機關簽署。Android 目前不會為應用程式憑證執行 CA 驗證。

應用程式也可以在「簽章」保護層級宣告安全性權限,只允許使用相同金鑰簽署的應用程式存取,同時保留不同的 UID 和應用程式沙箱。您可以使用 共用 UID 功能,讓應用程式與共用應用程式沙箱建立更緊密的關係,其中兩個或更多使用相同開發人員金鑰簽署的應用程式,可以在其資訊清單中宣告共用 UID。

APK 簽署配置

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

為提高相容性,請以所有配置簽署應用程式,先使用 v1,接著依序為 v2、v3。相較於僅使用 v1 配置簽署的應用程式,Android 7.0 以上版本的裝置安裝使用 v2 以上配置簽署的應用程式速度更快。較舊的 Android 平台會忽略 v2 以上版本的簽名,因此需要應用程式包含 v1 簽名。

JAR 簽署 (v1 配置)

APK 簽署功能自 Android 推出以來就一直存在。此類型是根據 已簽署的 JAR 建立。如要進一步瞭解如何使用此配置,請參閱 Android Studio 說明文件,瞭解如何 簽署應用程式

第 1 版簽名無法保護 APK 的部分功能,例如 ZIP 中繼資料。APK 驗證工具需要處理大量不受信任 (尚未驗證) 的資料結構,然後捨棄簽章未涵蓋的資料。這會提供相當大的攻擊面。此外,APK 驗證工具必須解壓縮所有已壓縮的項目,因此會耗用更多時間和記憶體。為解決這些問題,Android 7.0 推出了 APK Signature Scheme v2。

APK 簽署配置 v2 和 v3 (v2+ 配置)

搭載 Android 7.0 以上版本的裝置支援 APK 簽署配置 v2 (v2 配置) 以上版本。(v2 配置圖已在 Android 9 中更新為 v3,以便在簽署區塊中加入其他資訊,但其他運作方式相同)。APK 內容會經過雜湊處理和簽署,然後將產生的 APK 簽署區塊插入 APK。如要進一步瞭解如何將 v2+ 配置套用至應用程式,請參閱「 APK Signature Scheme v2」。

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

新格式可回溯相容,因此只要 APK 也採用 v1 簽署,即可在舊版 Android 裝置上安裝以新簽署格式簽署的 APK,而這些裝置會直接忽略新增至 APK 的額外資料。

APK 簽章驗證程序

圖 1. APK 簽章驗證程序

系統會根據儲存在 APK 簽署區塊中的 v2+ 簽名,驗證 APK 的整個檔案雜湊值。雜湊範圍涵蓋 APK 簽署區塊以外的所有項目,其中包含 v2+ 簽章。對 APK 簽署區塊以外的 APK 進行任何修改,都會使 APK 的 v2+ 簽名失效。如果 APK 的 v2+ 簽章簡化,其 v1 簽章會指定 APK 是以 v2 簽署,因此 Android 7.0 以上版本會拒絕使用其 v1 簽章驗證 APK,因此也會遭到拒絕。

如要進一步瞭解 APK 簽名驗證程序,請參閱 APK Signature Scheme v2 的「 驗證」一節。