天天看點

APK Signature Scheme v2 APK Signature Scheme v2

APK Signature Scheme v2

對于Android開發者來說,我想大家應該都知道,在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2,是以我大緻總結一下,我們開發者需要了解的新的打包的方式和簽名步驟。

基本資訊

  1. 用于驗證 APK 完整性的 APK 加密簽名現在直接位于 ZIP Central Directory 前面。
  2. 在 v1 中,簽名通過整個 APK 檔案的二進制内容進行計算并驗證,而不是通過歸檔中每個檔案的已解壓檔案内容。
  3. 可同時通過 v1 和 v2 簽名對 APK 進行簽署,以使其仍能向後相容以前的 Android 版本。

原因

為什麼谷歌要做這個事情呢?第一點毋庸置疑,肯定是處于安全性的考慮,之前的校驗方式開發者可以在打包之後對apk做很多處理,第二為了性能考慮,安裝校驗的時候不需要再解壓縮校驗,進而提升安裝速度(說句玩笑話,個人感覺沒什麼鳥用,也不需要關系)

那麼問題來了

全新的簽名給我們程式員帶來的麻煩卻很大:

  1. 由于在 v1 中僅驗證未解壓的檔案内容,是以,在 APK 簽署後可進行許多修改 - 可以移動甚至重新壓縮檔案。事實上,編譯過程中要用到的 zipalign 工具就是這麼做的,它用于根據正确的位元組限制調整 ZIP 條目,以改進運作時性能。而且我們也可以利用這個東西,在打包之後修改META-INF目錄下面的内容,或者修改Zip的注釋來實作多管道的打包,在v1簽名中都可以校驗通過
  2. v2 簽名将驗證歸檔中的所有位元組,而不是單個 ZIP 條目,是以, 在簽署後無法再運作 zipalign 。正因如此,現在,在編譯過程中,Google将壓縮、調整和簽署合并成一步完成。
  3. 如有任何自定義任務篡改 APK 檔案或對其進行後處理(無論以任何方式),那麼v2 簽名會有廢棄的風險,進而導緻您的 APK 與 Android 7.0 及更高版本不相容。

解決途徑

  1. 如果我們選擇手動簽名(比如使用指令行)那麼 Android SDK 中提供了一個名為 apksigner 的新工具,該工具可同時提供 v1 和 v2 APK 簽署與驗證。請注意,如果您使用 v2 簽名,則在運作 apksigner之前,必須先運作 zipalign 。
  2. 來自 JDK 的 jarsigner 工具與 Android v2 簽名不相容,是以,如果您要保留 v2 簽名,您不能用它來重新簽署 APK。
  3. 如果我們還想使用之前的打包方式,不做修改,那麼Google也是為我們提供了配置方法的用來關閉v2簽名:
    v1SigningEnabled false
    v2SigningEnabled false      

總結

雖然說現在Google有提供方法來關閉v2校驗,但是我相信,一旦等到這種方式成熟之後,它會成為一個必需品,畢竟安全第一嘛,我們還是要接納新事物的,好了,大概就講這麼多,有需要的可以看看。

轉自:APK Signature Scheme v2

繼續閱讀