當前位置:首頁 » 安卓系統 » androidv2簽名

androidv2簽名

發布時間: 2023-06-16 00:15:01

1. Android基礎『V1V2V3簽名』

基礎概念
簽名:在 APK 中寫入一個「指紋」。指紋寫入以後,APK 中有任何修改,都會導致這個指紋無效,Android 系統在安裝 APK 進行簽名校驗時就會不通過,從而保證了安全性。
摘要演算法: 使用一段簡單的看上去隨機的不可逆向的固定長度的字元串來表示一個文件的唯一性。 常見的摘要演算法如MD5(128個比特位)、SHA-1演算法(160/192/256個比特位)。
公鑰密碼體制:也稱非對稱演算法,特點是 公鑰是公開的 ,私鑰是保密的。常見的如:RSA。
展開討論一下RSA:

Android中的簽名方案
V1 :基於jarsigner(JDK自帶工具,使用keystore文件進行簽名) 或 apksigner(Android專門提供的,使用pk8、x509.pem進行簽名)。keystore和pk8/x509.pem可以相互轉換。
簽名原理:首先keystore文件包含一個MD5和一個SHA1摘要。 這也是很多開放平台需要我們上傳的摘要數據
簽名APK後會在META-INF文件夾下生產CERT.RSA、CERT.SF、MANIFEST.MF三個文件。

在apk中,/META-INF文件夾中保存著apk的簽名信息,一般至少包含三個文件,[CERT].RSA,[CERT].SF和MANIFEIST.MF文件。這三個文件就是對apk的簽名信息。
MANIFEST.MF中包含對apk中除了/META-INF文件夾外所有文件的簽名值,簽名方法是先SHA1()(或其他hash方法)在base64()。存儲形式是:Name加[SHA1]-Digest。
[CERT].SF是對MANIFEST.MF文件整體簽名以及其中各個條目的簽名。一般地,如果是使用工具簽名,還多包括一項。就是對MANIFEST.MF頭部信息的簽名,關於這一點前面源碼分析中已經提到。
[CERT].RSA包含用私鑰對[CERT].SF的簽名以及包含公鑰信息的數字證書。
  是否存在簽名偽造可能:
修改(含增刪改)了apk中的文件,則:校驗時計算出的文件的摘要值與MANIFEST.MF文件中的條目不匹配,失敗。
修改apk中的文件+MANIFEST.MF,則:MANIFEST.MF修改過的條目的摘要與[CERT].SF對應的條目不匹配,失敗。
修改apk中的文件+MANIFEST.MF+[CERT].SF,則:計算出的[CERT].SF簽名與[CERT].RSA中記錄的簽名值不匹配,失敗。
修改apk中的文件+MANIFEST.MF+[CERT].SF+[CERT].RSA,則:由於證書不可偽造,[CERT].RSA無法偽造。

V2 :7.0新增的
簽名後的包會被分為四部分
1. Contents of ZIP entries(from offset 0 until the start of APK Signing Block)
2. APK Signing Block
3. ZIP Central Directory
4. ZIP End of Central Directory
新應用簽名方案的簽名信息會被保存在區塊2(APK Signing Block) 中, 而區塊1( Contents of ZIP entries )、區塊3( ZIP Central Directory )、區塊4( ZIP End of Central Directory )是受保護的, 在簽名後任何對區塊1、3、4的修改都逃不過新的應用簽名方案的檢查

V3 :9.0新增的
格式大體和 v2 類似,在 v2 插入的簽名塊(Apk Signature Block v2)中,又添加了一個新快(Attr塊)
在這個新塊中,會記錄我們之前的簽名信息以及新的簽名信息,以 密鑰轉輪的方案,來做簽名的替換和升級。這意味著,只要舊簽名證書在手,我們就可以通過它在新的 APK 文件中,更改簽名 。
v3 簽名新增的新塊(attr)存儲了所有的簽名信息,由更小的 Level 塊,以 鏈表 的形式存儲。
其中每個節點都包含用於為之前版本的應用簽名的簽名證書,最舊的簽名證書對應根節點,系統會讓每個節點中的證書為列表中下一個證書簽名,從而為每個新密鑰提供證據來證明它應該像舊密鑰一樣可信。
這個過程有點類似 CA 證書的證明過程,已安裝的 App 的舊簽名,確保覆蓋安裝的 APK 的新簽名正確,將信任傳遞下去。
注意: 簽名方式只支持升級不支持降級,如安裝了V2的包,不能覆蓋替換為V1的包。

參考
Android App簽名(證書)校驗過程源碼分析
新一代開源Android渠道包生成工具Walle
Android 簽名機制 v1、v2、v3

2. Android開發之通過apksigner對apk進行v2簽名

在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2簽名方式,美團也推出相應的 Android渠道包生成工具Walle 。
360加固後需要重新簽名,藉助360官方提供的 簽名工具qihoo apk signer ,是採用的7.0以前的v1簽名,這時再通過walle打渠道包,是無法成功往apk寫入渠道號的。這時我們就必須藉助 Android SDK提供的apksigner 工具對已經打包好的apk進行v2簽名。

Android官方文檔已經對 apksigner的使用 有比較詳細的解釋。下面說說實際的操作步驟:

zip對齊,因為APK包的本質是一個zip壓縮文檔,經過邊界對齊方式優化能使包內未壓縮的數據有序的排列,從而減少應用程序運行時的內存消耗 ,通過空間換時間的方式提高執行效率(zipalign後的apk包體積增大了100KB左右)。
打開cmd,把目錄切換到SDK的build-tools目錄下(例如 E:SDKuild-tools25.0.2 ),執行:

zipalign命令選項不多:
-f : 輸出文件覆蓋源文件
-v : 詳細的輸出log
-p : outfile.zip should use the same page alignment for all shared object files within infile.zip
-c : 檢查當前APK是否已經執行過Align優化。
另外上面的數字4是代表按照4位元組(32位)邊界對齊。

這個工具位於SDK目錄的build-tools目錄下。必須說明的是,v2簽名方式時在Android7.0後才推出的,所以只有 版本>25 的SDKuild-tools中才能找到apksigner.jar。
打開cmd,把目錄切到SDKuild-tools版本號lib下(例如 E:SDKuild-tools25.0.2lib ),執行:

示例:

apksigner還支持另外的一些選項, 詳情點擊這里 。包括指定min-sdk版本、max-sdk版本、輸出詳細信息、檢查apk是否已經簽名等等。
例如檢查apk是否已經簽名:

zipalign + apksigner,兩步走完成對apk包的v2簽名。且以上工具位於AndroidSDK目錄的build-tools中。

3. Android | 他山之石,可以攻玉!一篇文章看懂 v1/v2/v3 簽名機制

這篇文章的內容會涉及以下前置 / 相關知識,貼心的我都幫你准備好了,請享用~

數字簽名(Digital Signature)也叫作數字指紋(Digital Fingerprint),它是消息摘要演算法和非對稱加密演算法的結合體,能夠驗證數據的完整性,並且認證數據的來源

數據簽名演算法的模型分為兩個主要階段:

需要注意的是,Android 目前不對應用證書進行 CA 認證,應用可以由第三方(OEM、運營商、其他應用市場)簽名,也可以自行簽名。

應用 APK 其實是一種特殊的 Zip 壓縮包,無法避免惡意破解者解壓 / 反編譯修改內容,針對這個問題有何解決方案呢?他山之石,可以攻玉 ——數字簽名演算法。應用簽名正是數字簽名演算法的應用場景之一,與其他應用場景類似,目的無非是:

Android 平台上運行的每個應用都必須有開發者的簽名。在安裝應用時,軟體包管理器會驗證 APK 是否已經過適當簽名,安裝程序會拒絕沒有獲得簽名就嘗試安裝的應用。

軟體包管理器在安裝應用前會驗證應用摘要,如果破解者修改了 apk 里的內容,那麼摘要就不再匹配,驗證失敗(驗證流程見下文方案)。

截止至 Android 11,Android 支持以下三種應用簽名方案:

為了提高兼容性,必須按照 v1、v2、v3 的先後順序採用簽名方案,低版本平台會忽略高版本的簽名方案在 APK 中添加的額外數據。

v1 簽名方案是基於 Jar 的簽名。

首先,我們先來分析其簽名產物。 v1 簽名後會增加 META-INF 文件夾 ,其中會有如下三個文件。考慮到使用不同的證書和簽名方式,得到的文件名可能不同,因此你只要留意文件的後綴即可:

v1 簽名流程如下:

MANIFEST.MF(Message Digest File,摘要文件)

*.SF(Signature File,簽名文件)

驗證流程可以分為驗證簽名和驗證完整性兩個步驟:

驗證簽名步驟:

如果上述簽名驗證結果正確,才會驗證完整性:

以上任何步驟驗證失敗,則整個 APK 驗證失敗。

為了解決這些問題,Android 7.0 中引入了 APK 簽名方案 v2。

v2 簽名方案是一種 全文件簽名方案 ,該方案能夠發現對 APK 的受保護部分進行的所有更改,相對於 v1 簽名方案驗證速度更快,完整性覆蓋范圍更廣。

在分析 v2 簽名方案之前,我們先簡單了解一下 Zip 文件格式:

首先,我們先來分析其簽名產物。v2 簽名後會在 「條目內容區」和「中央目錄區」之間插入「APK 簽名分塊(APK Signing Block)」

從左到右邊,我們定義為區塊 1~4。

相對與 v1 簽名方案,v2 簽名方案不再以文件為單位計算摘要了,而是以 1 MB 為單位將文件拆分為多個連續的塊(chunk),每個分區的最後一個塊可能會小於 1 MB。

v2 簽名流程如下:

驗證流程可以分為驗證簽名和驗證完整性兩個步驟:

簽名方案 v3 支持密鑰輪換,應用能夠在 APK 更新過程中更改其簽名密鑰。

【累了,後面先不寫了...】

這一節,我們介紹基於 Android 應用簽名機制的衍生應用場景。

在 v1 方案中, MANIFEST.MF *.SF 這兩個文件會記錄大量的文件名和文件摘要。如果 apk 中文件數很多,而且文件名很長,那麼這兩個文件會變得很大。使用 AndResGuard 工具,可以將文件名轉換為短路徑文件名,從而減少這兩個文件的大小。

在實際生產中,往往需要生成多個渠道的 APK 包,傳統的方法是使用 APKTool 逆向工具、Flavor + BuildType 等方案,這一類多渠道打包方案的缺點是耗時嚴重。隨著 Android 應用簽名方案的演進,演變出了不同的多渠道打包方案:

在 v1 方案中,我們提到了完整性校驗不覆蓋到 META-INF 文件夾的問題。有些多渠道打包方案就是利用了這個問題,在 META-INF 文件夾下添加空文件, 用空文件的名稱來作為渠道的唯一標識 ,就可以節省打包的時間,提高打渠道包的速度。

除了添加空文件的方法,還可以向 APK 添加 Zip Comment 來生成多渠道包(APK 本身就是特殊的 Zip 包)。

在 v2 簽名方案中,幾乎整個 APK 都納入保護范圍,如果向 APK 添加空文件或 Zip Comment 的話,在安裝時會報以下錯誤:

新背景下的多渠道打包方案,則是利用了 APK 簽名分塊(區塊 2)不受保護 & 欄位可擴展的特點 ,向區塊中添加多渠道信息(ID-Value),例如 美團多渠道打包方案 Walle 。

4. 談一談Android的簽名機制

首先,簽名是防止apk信息被修改的一個機制,打包時把apk的信息與證書做處理,生成加密信息,安裝時發現問題則拒絕安裝
v1簽名將apk的其他文件與證書做處理,信息保存到META-INF文件夾里,這么做的主要問題是直接修改apk包體是沒法檢測出來的,並由此導致了如Janus(CVE-2017-13156)這樣的極嚴重的漏洞(ART支持直接運行dex文件,通過dex頭部的魔數進行判斷,而應用安裝過程中是通過zip尾部的魔數判斷是否是有效的zip文件,所以只要構造出一個既是dex又是zip的文件就能繞過簽名驗證修改裡面的dex文件)
v2簽名則直接用apk文件,處理之後寫入進去,這樣修改包體也會被系統檢測出從而被拒絕安裝.

v1簽名:將apk中文件加密保存到META-INF目錄中,不包含META-INF目中的文件。生成MANIFEST.MF、CERT.SF、CERT.RSA文件
MANIFEST.MF :保存各文件的SHA-1通過BASE64加密後的值
CERT.SF:保存MANIFEST.MF文件的SHA-1通過Base64加密後的值 和MANIFEST.MF中各項的值再次SHA-1並Base64加密保存
CERT.RSA:保存公鑰和發布機構信息

v2簽名:對apk整個文件進行分塊摘要加密,並把加密信息存在zip中央目錄前 放在apk sign block區

Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature來自JDK。
V1:應該是通過ZIP條目進行驗證,這樣APK 簽署後可進行許多修改 - 可以移動甚至重新壓縮文件。

V2:驗證壓縮文件的所有位元組,而不是單個 ZIP 條目,因此,在簽名後無法再更改(包括 zipalign)。正因如此,現在在編譯過程中,我們將壓縮、調整和簽署合並成一步完成。好處顯而易見,更安全而且新的簽名可縮短在設備上進行驗證的時間(不需要費時地解壓縮然後驗證),從而加快應用安裝速度。

v1和v2的簽名使用
1)只勾選v1簽名並不會影響什麼,但是在7.0上不會使用更安全的驗證方式
2)只勾選V2簽名7.0以下會直接安裝完顯示未安裝,7.0以上則使用了V2的方式驗證
3)同時勾選V1和V2則所有機型都沒問題

5. Android V1及V2簽名原理簡析

Android為了保證系統及應用的安全性,在安裝APK的時候需要校驗包的完整性,同時,對於覆蓋安裝的場景還要校驗新舊是否匹配,這兩者都是通過Android簽名機制來進行保證的,本文就簡單看下Android的簽名與校驗原理,分一下幾個部分分析下:

簽名是摘要與非對稱密鑰加密相相結合的產物,摘要就像內容的一個指紋信息,一旦內容被篡改,摘要就會改變,簽名是摘要的加密結果,摘要改變,簽名也會失效。Android APK簽名也是這個道理,如果APK簽名跟內容對應不起來,Android系統就認為APK內容被篡改了,從而拒絕安裝,以保證系統的安全性。目前Android有三種簽名V1、V2(N)、V3(P),本文只看前兩種V1跟V2,對於V3的輪密先不考慮。先看下只有V1簽名後APK的樣式:

再看下只有V2簽名的APK包樣式:

同時具有V1 V2簽名:

可以看到,如果只有V2簽名,那麼APK包內容幾乎是沒有改動的,META_INF中不會有新增文件,按Google官方文檔:在使用v2簽名方案進行簽名時,會在APK文件中插入一個APK簽名分塊,該分塊位於zip中央目錄部分之前並緊鄰該部分。在APK簽名分塊內, 簽名和簽名者身份信息會存儲在APK簽名方案v2分塊中,保證整個APK文件不可修改 ,如下圖:

而V1簽名是通過META-INF中的三個文件保證簽名及信息的完整性:

V1簽名是如何保證信息的完整性呢?V1簽名主要包含三部分內容,如果狹義上說簽名跟公鑰的話,僅僅在.rsa文件中,V1簽名的三個文件其實是一套機制,不能單單拿一個來說事,

如果對APK中的資源文件進行了替換,那麼該資源的摘要必定發生改變,如果沒有修改MANIFEST.MF中的信息,那麼在安裝時候V1校驗就會失敗,無法安裝,不過如果篡改文件的同時,也修改其MANIFEST.MF中的摘要值,那麼MANIFEST.MF校驗就可以繞過。

CERT.SF個人覺得有點像冗餘,更像對文件完整性的二次保證,同繞過MANIFEST.MF一樣,.SF校驗也很容易被繞過。

CERT.RSA與CERT.SF是相互對應的,兩者名字前綴必須一致,不知道算不算一個無聊的標准。看下CERT.RSA文件內容:

CERT.RSA文件裡面存儲了證書公鑰、過期日期、發行人、加密演算法等信息,根據公鑰及加密演算法,Android系統就能計算出CERT.SF的摘要信息,其嚴格的格式如下:

從CERT.RSA中,我們能獲的證書的指紋信息,在微信分享、第三方SDK申請的時候經常用到,其實就是公鑰+開發者信息的一個簽名:

除了CERT.RSA文件,其餘兩個簽名文件其實跟keystore沒什麼關系,主要是文件自身的摘要及二次摘要,用不同的keystore進行簽名,生成的MANIFEST.MF與CERT.SF都是一樣的,不同的只有CERT.RSA簽名文件。也就是說前兩者主要保證各個文件的完整性,CERT.RSA從整體上保證APK的來源及完整性,不過META_INF中的文件不在校驗范圍中,這也是V1的一個缺點。V2簽名又是如何保證信息的完整性呢?

前面說過V1簽名中文件的完整性很容易被繞過,可以理解 單個文件完整性校驗的意義並不是很大 ,安裝的時候反而耗時,不如採用更加簡單的便捷的校驗方式。V2簽名就不針對單個文件校驗了,而是 針對APK進行校驗 ,將APK分成1M的塊,對每個塊計算值摘要,之後針對所有摘要進行摘要,再利用摘要進行簽名。

也就是說,V2摘要簽名分兩級,第一級是對APK文件的1、3 、4 部分進行摘要,第二級是對第一級的摘要集合進行摘要,然後利用秘鑰進行簽名。安裝的時候,塊摘要可以並行處理,這樣可以提高校驗速度。

APK是先摘要,再簽名,先看下摘要的定義:Message Digest:摘要是對消息數據執行一個單向Hash,從而生成一個固定長度的Hash值,這個值就是消息摘要,至於常聽到的MD5、SHA1都是摘要演算法的一種。理論上說,摘要一定會有碰撞,但只要保證有限長度內碰撞率很低就可以,這樣就能利用摘要來保證消息的完整性,只要消息被篡改,摘要一定會發生改變。但是,如果消息跟摘要同時被修改,那就無從得知了。

而數字簽名是什麼呢(公鑰數字簽名),利用非對稱加密技術,通過私鑰對摘要進行加密,產生一個字元串,這個字元串+公鑰證書就可以看做消息的數字簽名,如RSA就是常用的非對稱加密演算法。在沒有私鑰的前提下,非對稱加密演算法能確保別人無法偽造簽名,因此數字簽名也是對發送者信息真實性的一個有效證明。不過由於Android的keystore證書是自簽名的,沒有第三方權威機構認證,用戶可以自行生成keystore,Android簽名方案無法保證APK不被二次簽名。

知道了摘要跟簽名的概念後,再來看看Android的簽名文件怎麼來的?如何影響原來APK包?通過sdk中的apksign來對一個APK進行簽名的命令如下:

其主要實現在 android/platform/tools/apksig 文件夾中,主體是ApkSigner.java的sign函數,函數比較長,分幾步分析

先來看這一步,ApkUtils.findZipSections,這個函數主要是解析APK文件,獲得ZIP格式的一些簡單信息,並返回一個ZipSections,

ZipSections包含了ZIP文件格式的一些信息,比如中央目錄信息、中央目錄結尾信息等,對比到zip文件格式如下:

獲取到 ZipSections之後,就可以進一步解析APK這個ZIP包,繼續走後面的簽名流程,

可以看到先進行了一個V2簽名的檢驗,這里是用來簽名,為什麼先檢驗了一次?第一次簽名的時候會直接走這個異常邏輯分支,重復簽名的時候才能獲到取之前的V2簽名,懷疑這里獲取V2簽名的目的應該是為了排除V2簽名,並獲取V2簽名以外的數據塊,因為簽名本身不能被算入到簽名中,之後會解析中央目錄區,構建一個DefaultApkSignerEngine用於簽名

先解析中央目錄區,獲取AndroidManifest文件,獲取minSdkVersion(影響簽名演算法),並構建DefaultApkSignerEngine,默認情況下V1 V2簽名都是打開的。

第五步與第六步的主要工作是:apk的預處理,包括目錄的一些排序之類的工作,應該是為了更高效處理簽名,預處理結束後,就開始簽名流程,首先做的是V1簽名(默認存在,除非主動關閉):

步驟7、8、9都可以看做是V1簽名的處理邏輯,主要在V1SchemeSigner中處理,其中包括創建META-INFO文件夾下的一些簽名文件,更新中央目錄、更新中央目錄結尾等,流程不復雜,不在贅述,簡單流程就是:

這里特殊提一下重復簽名的問題: 對一個已經V1簽名的APK再次V1簽名不會有任何問題 ,原理就是:再次簽名的時候,會排除之前的簽名文件。

可以看到目錄、META-INF文件夾下的文件、sf、rsa等結尾的文件都不會被V1簽名進行處理,所以這里不用擔心多次簽名的問題。接下來就是處理V2簽名。

V2SchemeSigner處理V2簽名,邏輯比較清晰,直接對V1簽名過的APK進行分塊摘要,再集合簽名,V2簽名不會改變之前V1簽名後的任何信息,簽名後,在中央目錄前添加V2簽名塊,並更新中央目錄結尾信息,因為V2簽名後,中央目錄的偏移會再次改變:

簽名校驗的過程可以看做簽名的逆向,只不過覆蓋安裝可能還要校驗公鑰及證書信息一致,否則覆蓋安裝會失敗。簽名校驗的入口在PackageManagerService的install里,安裝官方文檔,7.0以上的手機優先檢測V2簽名,如果V2簽名不存在,再校驗V1簽名,對於7.0以下的手機,不存在V2簽名校驗機制,只會校驗V1,所以,如果你的App的miniSdkVersion<24(N),那麼你的簽名方式必須內含V1簽名:

校驗流程就是簽名的逆向,了解簽名流程即可,本文不求甚解,有興趣自己去分析,只是額外提下覆蓋安裝,覆蓋安裝除了檢驗APK自己的完整性以外,還要校驗證書是否一致只有證書一致(同一個keystore簽名),才有可能覆蓋升級。覆蓋安裝同全新安裝相比較多了幾個校驗

這里只關心證書部分:

Android V1及V2簽名簽名原理簡析

僅供參考,歡迎指正

6. Android每日一題:v3簽名key和v2還有v1有什麼區別

答:在v1版本的簽名中,簽名以文件的形式存在於apk包中,這個版本的apk包就是一個標準的zip包,V2和V1的差別是V2是對整個zip包進行簽名,而且在zip包中增加了一個apk signature block,裡面保存槐侍簽名信息。

v2版本簽名塊(APK Signing Block)本身又主要分成三部分:

SignerData(簽名者數據):主要包兄明培括簽名者的證書,整個APK完整性校驗hash,以及一些必要信息

Signature(簽名):開發者對SignerData部分數據的簽名數據

PublicKey(公鑰):用於驗簽的公鑰數據

v3版本簽名塊也分成同樣的三部分,與v2不同羨唯的是在SignerData部分,v3新增了attr塊,其中是由更小的level塊組成。每個level塊中可以存儲一個證書信息。前一個level塊證書驗證下一個level證書,以此類推。最後一個level塊的證書,要符合SignerData中本身的證書,即用來簽名整個APK的公鑰所屬於的證書

熱點內容
電腦開機後一直在配置更新怎麼進入系統 發布:2025-02-07 18:17:43 瀏覽:10
新浪上傳視頻在哪 發布:2025-02-07 18:17:38 瀏覽:556
外匯點差演算法 發布:2025-02-07 18:16:41 瀏覽:78
我的世界各種伺服器核心的區別 發布:2025-02-07 18:15:52 瀏覽:677
雲伺服器客戶怎麼轉 發布:2025-02-07 18:13:19 瀏覽:205
什麼漫畫軟體可以緩存 發布:2025-02-07 17:56:21 瀏覽:268
安卓如何取消手機搜索 發布:2025-02-07 17:46:04 瀏覽:217
ontoucheventandroid 發布:2025-02-07 17:45:50 瀏覽:869
愛思助手如何看配置 發布:2025-02-07 17:32:27 瀏覽:175
自己的電腦怎麼搭建手游伺服器端 發布:2025-02-07 17:21:44 瀏覽:47