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 服務具有多個簽名。

如何識別正確的簽名:

  1. AndroidFreeware 擁有先進的 APK 檢查器,执行 Android 權限檢查、探測風險標誌和過濾器、計算 md5、sha1、sha256 檢查碼,並執行 VirusTotal 防病毒檢查。
  2. 使用工具如 My APK 查看應用簽名。
  3. 使用嘗試與錯誤的方法。安裝不同的 APK 直到更新成功,然後記住正確的簽名以便以後更新。
  4. 將應用上傳到 APKMirror 使用 ML Manager 查找現有簽名。
  5. 一些桌面工具能夠找到 APK 文件的簽名。其中包括 Google 的 apksigner,IBM 的 keytool,和 Warren Bank 的 print-apk-signature

目錄