Android 用apksigner驗(yàn)證Apk簽名

簡介

在Android應(yīng)用開發(fā)和安全檢測中,APK簽名驗(yàn)證是一個至關(guān)重要的環(huán)節(jié)。每個Android應(yīng)用在發(fā)布前都必須進(jìn)行數(shù)字簽名,這不僅是Google Play商店的要求,更是Android系統(tǒng)安全機(jī)制的重要組成部分。簽名可以確保應(yīng)用的完整性和來源可信度,防止應(yīng)用被篡改或惡意替換。本文將深入探討如何使用Android SDK中提供的apksigner工具來驗(yàn)證APK簽名的有效性。

引言

隨著Android生態(tài)系統(tǒng)的不斷發(fā)展,應(yīng)用安全問題日益受到重視。APK簽名作為Android安全模型的基礎(chǔ)組件之一,承擔(dān)著驗(yàn)證應(yīng)用身份和保證應(yīng)用完整性的重要職責(zé)。在日常開發(fā)、測試以及安全審計工作中,我們經(jīng)常需要驗(yàn)證APK的簽名信息,以確認(rèn)應(yīng)用的合法性。

特別是在以下場景中,APK簽名驗(yàn)證顯得尤為重要:

  1. 應(yīng)用發(fā)布前的安全檢查
  2. 第三方應(yīng)用的安全審計
  3. 反編譯分析前的準(zhǔn)備工作
  4. 企業(yè)內(nèi)部應(yīng)用分發(fā)時的合規(guī)性檢查

傳統(tǒng)的簽名驗(yàn)證方法較為復(fù)雜,而apksigner作為Android SDK官方推薦的工具,提供了簡潔高效的簽名驗(yàn)證功能。

apksigner工具介紹

工具作用

apksigner是Android SDK Build Tools 24.0.3及以上版本中提供的命令行工具,專門用于APK文件的簽名和驗(yàn)證。它取代了舊版的jarsigner工具,成為Android官方推薦的APK簽名解決方案。apksigner不僅支持傳統(tǒng)的JAR簽名方案,還支持Android 7.0引入的APK簽名方案v2和v3,確保了對不同Android版本的兼容性。

工具位置

apksigner工具位于Android SDK的build-tools目錄下。具體路徑通常為:

$ANDROID_HOME/build-tools/<version>/apksigner

其中$ANDROID_HOME是Android SDK的安裝路徑,<version>是build-tools的版本號。例如在我的環(huán)境中,路徑為:

/Users/stromdzh/Library/Android/sdk/build-tools/36.0.0/apksigner

為了方便使用,建議將該路徑添加到系統(tǒng)的PATH環(huán)境變量中:

export PATH=$PATH:$ANDROID_HOME/build-tools/36.0.0

基本用法

apksigner工具提供了豐富的命令和選項,主要命令包括:

  1. sign:對APK進(jìn)行簽名
  2. verify:驗(yàn)證APK簽名
  3. version:顯示工具版本
  4. help:顯示幫助信息

使用格式為:

apksigner <command> [options]

例如查看工具版本:

apksigner version

獲取幫助信息:

apksigner --help
apksigner verify --help

APK簽名驗(yàn)證詳細(xì)步驟

基本驗(yàn)證命令

使用apksigner驗(yàn)證APK簽名最基本的方式是使用verify命令:

apksigner verify <apk-file>

該命令會檢查APK是否能在目標(biāo)Android設(shè)備上成功驗(yàn)證簽名。如果驗(yàn)證通過,命令執(zhí)行后不會有任何輸出;如果驗(yàn)證失敗,則會顯示相應(yīng)的錯誤信息。

詳細(xì)驗(yàn)證命令

為了獲取更多的驗(yàn)證信息,可以使用-v--verbose參數(shù):

apksigner verify -v <apk-file>

此命令會顯示詳細(xì)的驗(yàn)證結(jié)果,包括使用的簽名方案(V1/JAR簽名或V2/APK簽名方案)。

查看證書信息

在驗(yàn)證APK簽名時,我們通常還需要查看簽名證書的詳細(xì)信息,這時可以使用--print-certs參數(shù):

apksigner verify --print-certs <apk-file>

該命令會顯示APK簽名證書的相關(guān)信息,包括證書的發(fā)行者、主題、有效期等。

同時使用詳細(xì)模式和證書信息:

apksigner verify -v --print-certs <apk-file>

完整的驗(yàn)證命令示例

在實(shí)際使用中,我們通常會結(jié)合多個參數(shù)來獲取完整的驗(yàn)證信息:

apksigner verify -v --print-certs MyApp.apk

執(zhí)行結(jié)果示例:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1

Signer #1 certificate DN: CN=Android Debug, O=Android, C=US
Signer #1 certificate SHA-256 digest: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
Signer #1 certificate SHA-1 digest: abcdef1234567890abcdef1234567890abcdef12
Signer #1 certificate MD5 digest: 12abcdef34567890abcdef1234567890ab
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key exponent: 65537
Signer #1 is digested using Digest SHA-256
Signer #1 is signed using Signature algorithm SHA256withRSA

參數(shù)說明

apksigner verify命令支持以下常用參數(shù):

參數(shù) 說明
-v, --verbose 顯示詳細(xì)驗(yàn)證信息
--print-certs 顯示簽名證書信息
--print-certs-pem 顯示簽名證書信息并以PEM格式打印證書
--min-sdk-version 指定最低API級別進(jìn)行驗(yàn)證
--max-sdk-version 指定最高API級別進(jìn)行驗(yàn)證
-Werr 將警告視為錯誤
--in 指定要驗(yàn)證的APK文件(替代將APK作為最后一個參數(shù))
-h, --help 顯示幫助信息

實(shí)際案例演示

為了更好地理解apksigner的使用方法,下面我們通過幾個實(shí)際案例來演示如何驗(yàn)證不同來源的APK文件。

案例1:驗(yàn)證官方應(yīng)用

假設(shè)我們要驗(yàn)證從Google Play商店下載的官方應(yīng)用,例如Chrome瀏覽器:

apksigner verify -v --print-certs chrome.apk

驗(yàn)證結(jié)果可能如下:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1

Signer #1 certificate DN: CN=Google Inc., OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Signer #1 certificate SHA-256 digest: f0fd6c5b410f25cb25c3b7bb9542a13ec0dd7ff4011b530239be491984069233
Signer #1 certificate SHA-1 digest: 38918a453d07199354f8b19af05ec6562ced5788
Signer #1 certificate MD5 digest: 59105f690f4c49f470dc8e38fd152eb8

可以看到,該APK使用了V1和V2兩種簽名方案,并且證書發(fā)行者為Google Inc.

案例2:驗(yàn)證系統(tǒng)應(yīng)用

系統(tǒng)應(yīng)用通常由設(shè)備制造商簽名,我們以某個系統(tǒng)應(yīng)用為例:

apksigner verify -v --print-certs system-app.apk

驗(yàn)證結(jié)果可能如下:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): false
Number of signers: 1

Signer #1 certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Signer #1 certificate SHA-256 digest: 9a3a083a23e15ffdde6aeac0958e600729c7ba8b4546595ce428614802bb8030
Signer #1 certificate SHA-1 digest: cd7f000ec00b40f3a73d80a00c82d76b9bdf620f
Signer #1 certificate MD5 digest: 7be4efa0580e8c5984211dae9f2b7f8d

該應(yīng)用只使用了V1簽名方案,證書信息顯示為Android系統(tǒng)默認(rèn)證書。

案例3:驗(yàn)證第三方應(yīng)用

對于從第三方渠道下載的應(yīng)用,我們需要格外注意其簽名信息:

apksigner verify -v --print-certs third-party-app.apk

驗(yàn)證結(jié)果可能如下:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1

Signer #1 certificate DN: CN=Developer, OU=Development, O=MyCompany, L=City, ST=Province, C=CN
Signer #1 certificate SHA-256 digest: a1b2c3d4e5f67890123456789012345678901234567890123456789012345678
Signer #1 certificate SHA-1 digest: 1234567890abcdef1234567890abcdef12345678
Signer #1 certificate MD5 digest: abcdef1234567890abcdef1234567890

通過對比證書信息,我們可以判斷該應(yīng)用的開發(fā)者身份。

案例4:驗(yàn)證簽名失敗的情況

當(dāng)我們驗(yàn)證一個被篡改或未簽名的APK時,會得到錯誤信息:

apksigner verify corrupted-app.apk

可能的錯誤輸出:

DOES NOT VERIFY
ERROR: MIN_SIG_SCHEME_FOR_TARGET_SDK_NOT_MET: Target SDK version 30 requires a minimum of signature scheme v2; the APK is not signed with this or a stronger scheme.

這類錯誤提示可以幫助我們快速定位問題所在。

高級用法和注意事項

不同Android版本的兼容性

Android系統(tǒng)在不同版本中對APK簽名方案有不同的要求:

  1. Android 7.0 (API 24)及以上:引入了APK簽名方案v2,提高了簽名驗(yàn)證的性能和安全性
  2. Android 9.0 (API 28)及以上:默認(rèn)啟用APK簽名方案v2
  3. Android 11 (API 30)及以上:要求使用APK簽名方案v2或更高版本

因此,在驗(yàn)證APK簽名時,我們需要考慮目標(biāo)設(shè)備的Android版本:

apksigner verify --min-sdk-version 24 --max-sdk-version 28 app.apk

該命令會驗(yàn)證APK在Android 7.0到Android 9.0版本上的簽名兼容性。

處理警告信息

在某些情況下,apksigner可能會輸出警告信息而非錯誤信息。我們可以使用-Werr參數(shù)將警告視為錯誤:

apksigner verify -Werr app.apk

多簽名APK驗(yàn)證

一些APK可能包含多個簽名,這種情況在應(yīng)用更新或使用共享UID時可能出現(xiàn):

apksigner verify -v --print-certs multi-signer-app.apk

輸出可能顯示多個簽名者信息:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 2

Signer #1 certificate DN: CN=First Signer
Signer #2 certificate DN: CN=Second Signer

PEM格式證書導(dǎo)出

有時我們需要導(dǎo)出APK簽名證書的PEM格式以便進(jìn)一步分析:

apksigner verify --print-certs-pem app.apk > certificate.pem

注意事項

  1. 環(huán)境配置:確保ANDROID_HOME環(huán)境變量正確設(shè)置,并且build-tools路徑已添加到PATH中
  2. 權(quán)限問題:確保對APK文件具有讀取權(quán)限
  3. 文件完整性:驗(yàn)證前確保APK文件完整未損壞
  4. 版本兼容性:使用與目標(biāo)Android版本兼容的apksigner版本
  5. 安全考慮:不要僅依賴自動化工具,應(yīng)結(jié)合人工分析確認(rèn)結(jié)果

總結(jié)

APK簽名驗(yàn)證是Android應(yīng)用安全體系中的重要環(huán)節(jié),它不僅關(guān)系到應(yīng)用的合法性和完整性,更是防范惡意軟件的重要手段。通過本文的介紹,我們了解了apksigner工具的強(qiáng)大功能和靈活用法。

apksigner作為Android官方推薦的簽名工具,相比傳統(tǒng)工具具有以下優(yōu)勢:

  1. 全面支持:支持V1、V2、V3等多種簽名方案
  2. 高效驗(yàn)證:提供快速準(zhǔn)確的簽名驗(yàn)證功能
  3. 詳細(xì)信息:能夠輸出豐富的簽名和證書信息
  4. 版本兼容:針對不同Android版本提供相應(yīng)的驗(yàn)證策略

在實(shí)際開發(fā)和安全檢測工作中,熟練掌握apksigner的使用方法能夠幫助我們:

  1. 快速識別應(yīng)用的合法性
  2. 檢測APK是否被篡改
  3. 分析第三方應(yīng)用的安全風(fēng)險
  4. 確保應(yīng)用分發(fā)的安全性

隨著Android系統(tǒng)的不斷發(fā)展,應(yīng)用安全要求也在不斷提高。作為開發(fā)者和安全研究人員,我們需要持續(xù)關(guān)注Android安全機(jī)制的變化,合理利用像apksigner這樣的工具,共同維護(hù)Android生態(tài)系統(tǒng)的安全與健康發(fā)展。

在未來的工作中,建議將apksigner集成到自動化測試和安全掃描流程中,以提高工作效率和準(zhǔn)確性。同時,也要注意結(jié)合其他安全檢測工具,形成完整的安全防護(hù)體系。

參考資料

https://blog.csdn.net/think_ycx/article/details/84064504

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容