Android簽名機制及原理

Android簽名機制及原理

  • Android系統在安裝APK的時候,首先會檢驗APK的簽名,若是發現簽名文件不存在或者校驗簽名失敗,則會拒絕安裝,因此應用程序在發佈以前必定要進行簽名。給APK簽名能夠帶來如下好處:算法

    • 應用程序升級
      若是想無縫升級一個應用,Android系統要求應用程序的新版本與老版本具備相同的簽名與包名。若包名相同而簽名不一樣,系統會拒絕安裝新版應用。
    • 應用程序模塊化
      Android系統能夠容許同一個證書籤名的多個應用程序在一個進程裏運行,系統實際把他們做爲一個單個的應用程序。此時就能夠把咱們的應用程序以模塊的方式進行部署,而用戶能夠獨立的升級其中的一個模塊。
    • 代碼或數據共享
      Android提供了基於簽名的權限機制,一個應用程序能夠爲另外一個以相同證書籤名的應用程序公開本身的功能與數據,同時其它具備不一樣簽名的應用程序不可訪問相應的功能與數據。
    • 應用程序的可認定性
      簽名信息中包含有開發者信息,在必定程度上能夠防止應用被僞造。例如網易雲加密對Android APK加殼保護中使用的「校驗簽名(防二次打包)」功能就是利用了這一點。

  • 簽名的目的:
    要解決兩個問題:首先,要肯定消息的來源確實是其申明的那我的;其次,要保證信息在傳遞的過程當中不被第三方篡改,即便被篡改了,也能夠發覺出來。

  • 簽名原理模塊化

    • 對Apk中的每一個文件作一次算法(數據摘要+Base64編碼),保存到MANIFEST.MF文件中
    • 對MANIFEST.MF整個文件作一次算法(數據摘要+Base64編碼),存放到CERT.SF文件的頭屬性中,在對MANIFEST.MF文件中各個屬性塊作一次算法(數據摘要+Base64編碼),存到到一個屬性塊中。
    • 對CERT.SF文件作簽名,內容存檔到CERT.RSA中、

  • 對一個APK文件簽名以後,APK文件根目錄下會增長META-INF目錄,該目錄下增長三個文件:
MANIFEST.MF
NETEASE.RSA
NETEASE.SF
.RSA文件還多是.DSA文件,RSA與SF文件的文件名能夠更改,可是它們的命名必須同樣。
  • MANIFEST.MF中保存了APK裏全部文件的SHA1校驗值的BASE64編碼,格式以下(一個文件對應一條記錄):編碼

    Name: res/anim/abc_fade_in.xml
    SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI=
    Name: res/anim/abc_fade_out.xml
    SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ=
  • SF文件裏保存了MANIFEST.MF文件的SHA1校驗值的BASE64編碼,同時還保存了MANIFEST.MF中每一條記錄的SHA1檢驗值BASE64編碼,格式以下:加密

    SHA1-Digest-Manifest: ZRhh1HuaoEKMn6o21W1as0sMlaU=
    Name: res/anim/abc_fade_in.xml
    SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA=
    Name: res/anim/abc_fade_out.xml
    SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo=
  • RSA文件則包含了簽名的公鑰、簽名全部者等信息,還保存了用SHA1withRSA簽名算法對SF文件的簽名結果信息。
Android系統就是根據這三個文件的內容對APK文件進行簽名檢驗的。
相關文章
相關標籤/搜索