Google 致力于为黑人社区推动种族平等。查看具体举措
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

應用程序簽名

應用程序簽名使開發人員可以識別應用程序的作者並更新其應用程序,而無需創建複雜的界面和權限。在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。與僅使用v1方案簽名的應用程序相比,Android 7.0及更高版本的設備安裝使用v2 +方案簽名的應用程序的速度更快。較早的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驗證速度更快,並且可以檢測更多類別的未經授權的修改。

新格式是向後兼容的,因此只要新的簽名格式也是經過v1簽名的,就可以將使用新簽名格式簽名的APK安裝在較舊的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簽名方案v2的“ 驗證”部分