應用程式簽署功能可讓開發人員識別應用程式的作者,並更新應用程式,而無須建立複雜的介面和權限。在 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 配置:以 JAR 簽署為基礎
- v2 配置:Android 7.0 中引入的 APK Signature Scheme v2。
- 第 3 版配置:APK Signature Scheme v3,這是在 Android 9 中推出的配置。
為確保最大的相容性,請使用所有配置簽署應用程式,首先使用 v1,然後依序使用 v2 和 v3。相較於僅使用 v1 配置簽署的應用程式,Android 7.0 以上版本和後續裝置安裝使用 v2 以上配置簽署的應用程式速度更快。較舊的 Android 平台會忽略 v2 以上版本的簽名,因此需要應用程式包含 v1 簽名。
JAR 簽署 (v1 配置)
APK 簽署功能自 Android 推出以來就一直存在。此類型是根據 已簽署的 JAR 建立。如要進一步瞭解如何使用此配置,請參閱 Android Studio 的「 簽署應用程式」說明文件。
v1 簽章無法保護 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 的額外資料。
圖 1. APK 簽名驗證程序
系統會根據儲存在 APK 簽署區塊中的 v2+ 簽名,驗證 APK 的整個檔案雜湊值。除了 APK 簽署區塊 (包含 v2+ 簽章) 之外,雜湊涵蓋了所有內容。對 APK 簽署區塊以外的 APK 進行任何修改,都會使 APK 的 v2+ 簽名失效。具有經過去除的 v2 以上簽名的 APK 也會遭到拒絕,因為其 v1 簽名會指定 APK 已使用 v2 簽名,這會導致 Android 7.0 以上版本拒絕使用 v1 簽名驗證 APK。
如要進一步瞭解 APK 簽名驗證程序,請參閱 APK Signature Scheme v2 的「 驗證」一節。