Android 應用簽名和簽名驗證
應用簽名
應用簽名 是一個通過私鑰對 APK(Android Package) 進行簽名的過程,用於唯一識別應用開發者。此過程確保應用來自公示的開發者,且自簽名之後未被篡改。以下是一個詳細的解析:
生成 Keystore
- 開發者創建 keystore,一個包含密鑰的二進製文件。這個 keystore 包含一個用於簽名 APK 的私鑰。
- keystore 通過密碼保護,應保持安全以防未經授權的訪問。
簽名 APK
- 在構建過程中或之後,透過存儲在 keystore 裡的私鑰對 APK 進行簽名。
- 此過程通過雜湊函數生成數位簽名,創建 APK 內容的唯一摘要。
- 然後,使用開發者私人密鑰對此摘要進行加密,且結果存儲於 APK 內。
納入證書
- APK 包含與用於簽名的私密鑰對應的公共密鑰的證書。
- 這個證書用於安裝過程中驗證數位簽名。
為什麼應用簽名重要?
- 確保真實性:確認應用開發者的身份。
- 保護完整性:確保應用在簽名之後未被篡改。
- 安全更新:確保更新來自原開發者,因為更新必須使用相同密鑰簽名。
簽名驗證
簽名驗證是 Android 系統在安裝前檢查 APK 的數位簽名確保其完整性和真實性的過程。看看這篇 Reddit 貼文,了解如何輕鬆驗證 APK 的簽名 / 真實性,接下來跟我們一起認识驗證如何運作:
提取證書
當一個 APK 被下載和啟動安裝時,設備會從 APK 中提取包含公共密鑰的證書。
解密簽名
- 設備使用從證書提取的公共密鑰解密鑲嵌在 APK 中的數位簽名。
- 解密產生了在簽名過程中生成的原始雜湊(摘要)。
生成雜湊
獨立地,設備使用與簽名過程相同的雜湊函數生成其對 APK 內容的雜湊。
比較雜湊
- 設備比較獨立生成的雜湊與數位簽名解密得來的雜湊。
- 匹配:若雜湊匹配,則確認 APK 的真實性和未篡改,允許安裝進行。
- 不匹配:若雜湊不匹配,表明 APK 自簽名以後可能被篡改,安裝會被阻止。
為什麼簽名驗證重要?
- 驗證真實性:確認 APK 是由申明的開發者簽名的。
- 維護完整性:確認 APK 自簽名以後未被修改。
- 保護用戶:阻止潛在的惡意 APK 被安裝。
如果應用擁有多個簽名,我應選擇哪一個?
大多數應用僅有一個有效簽名,但有些可能有多個。您需要將 APK 的簽名與設備上已安裝的應用的簽名匹配,以避免更新錯誤。
多個簽名的原因
- 密鑰輪換:Android 9允許開發者切換簽名密鑰。這是由於APK 簽名方案 v3。
- 發佈渠道:來自不同來源的應用(例如,Play 商店、Github)可能擁有不同的簽名。
- 系統應用:系統應用的密鑰可能因設備或操作系統版本而異。
- 未知例外:一些應用如 Google 的 檔案管理器 和 Play 服務具有多個簽名。
如何識別正確的簽名:
- AndroidFreeware 擁有先進的 APK 檢查器,执行 Android 權限檢查、探測風險標誌和過濾器、計算 md5、sha1、sha256 檢查碼,並執行 VirusTotal 防病毒檢查。
- 使用工具如 My APK 查看應用簽名。
- 使用嘗試與錯誤的方法。安裝不同的 APK 直到更新成功,然後記住正確的簽名以便以後更新。
- 將應用上傳到 APKMirror 使用 ML Manager 查找現有簽名。
- 一些桌面工具能夠找到 APK 文件的簽名。其中包括 Google 的 apksigner,IBM 的 keytool,和 Warren Bank 的 print-apk-signature。