APK Signature Scheme v2
對于Android開發者來說,我想大家應該都知道,在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2,是以我大緻總結一下,我們開發者需要了解的新的打包的方式和簽名步驟。
基本資訊
- 用于驗證 APK 完整性的 APK 加密簽名現在直接位于 ZIP Central Directory 前面。
- 在 v1 中,簽名通過整個 APK 檔案的二進制内容進行計算并驗證,而不是通過歸檔中每個檔案的已解壓檔案内容。
- 可同時通過 v1 和 v2 簽名對 APK 進行簽署,以使其仍能向後相容以前的 Android 版本。
原因
為什麼谷歌要做這個事情呢?第一點毋庸置疑,肯定是處于安全性的考慮,之前的校驗方式開發者可以在打包之後對apk做很多處理,第二為了性能考慮,安裝校驗的時候不需要再解壓縮校驗,進而提升安裝速度(說句玩笑話,個人感覺沒什麼鳥用,也不需要關系)
那麼問題來了
全新的簽名給我們程式員帶來的麻煩卻很大:
- 由于在 v1 中僅驗證未解壓的檔案内容,是以,在 APK 簽署後可進行許多修改 - 可以移動甚至重新壓縮檔案。事實上,編譯過程中要用到的 zipalign 工具就是這麼做的,它用于根據正确的位元組限制調整 ZIP 條目,以改進運作時性能。而且我們也可以利用這個東西,在打包之後修改META-INF目錄下面的内容,或者修改Zip的注釋來實作多管道的打包,在v1簽名中都可以校驗通過
- v2 簽名将驗證歸檔中的所有位元組,而不是單個 ZIP 條目,是以, 在簽署後無法再運作 zipalign 。正因如此,現在,在編譯過程中,Google将壓縮、調整和簽署合并成一步完成。
- 如有任何自定義任務篡改 APK 檔案或對其進行後處理(無論以任何方式),那麼v2 簽名會有廢棄的風險,進而導緻您的 APK 與 Android 7.0 及更高版本不相容。
解決途徑
- 如果我們選擇手動簽名(比如使用指令行)那麼 Android SDK 中提供了一個名為 apksigner 的新工具,該工具可同時提供 v1 和 v2 APK 簽署與驗證。請注意,如果您使用 v2 簽名,則在運作 apksigner之前,必須先運作 zipalign 。
- 來自 JDK 的 jarsigner 工具與 Android v2 簽名不相容,是以,如果您要保留 v2 簽名,您不能用它來重新簽署 APK。
- 如果我們還想使用之前的打包方式,不做修改,那麼Google也是為我們提供了配置方法的用來關閉v2簽名:
v1SigningEnabled false v2SigningEnabled false
總結
雖然說現在Google有提供方法來關閉v2校驗,但是我相信,一旦等到這種方式成熟之後,它會成為一個必需品,畢竟安全第一嘛,我們還是要接納新事物的,好了,大概就講這麼多,有需要的可以看看。
轉自:APK Signature Scheme v2