網(wǎng)上大多文章討論的Android中簽名的兩個工具:jarsign和signapk
這篇不討論jarsign 主要是針對android軟件安全與逆向分析書中第二章2.2.5節(jié)使用的signapk工具打包出錯時另一種方案庄涡。
網(wǎng)上大多的文章都是使用signapk 在jre1.7環(huán)境下進行簽名脓恕,甚至更老的jre環(huán)境下庶喜。
但signapk 在JRE1.8環(huán)境下運行會拋出異常莺掠,原因是sun.misc.* 是sun公司的私有package,之前的歷史版本中含有該文件湿诊,目前已經(jīng)被移除嘹吨。將會報錯如圖:
這里介紹一個更加容易找到的簽名工具:apksigner?
apksigner是Google提供的Android apk簽名及驗證的專用工具,位于Android SDK/build-tools/SDK版本/apksigner.bat 支持V1(Jar Signature) V2(Full APK Signature) 兩種簽名包吝,而jarsigner是JDK提供的針對于jar包的通用簽名工具,支持V1簽名源葫。
下面是v1、v2的區(qū)別:
V1簽名:
來自JDK(jarsigner), 對zip壓縮包的每個文件進行驗證, 簽名后還能對壓縮包修改(移動/重新壓縮文件)
對V1簽名的apk/jar解壓,在META-INF存放簽名文件(MANIFEST.MF,CERT.SF,CERT.RSA),
其中MANIFEST.MF文件保存所有文件的SHA1指紋(除了META-INF文件), 由此可知:V1簽名是對壓縮包中單個文件簽名驗證
V2簽名:
來自Google(apksigner), 對zip壓縮包的整個文件驗證, 簽名后不能修改壓縮包(包括zipalign),
對V2簽名的apk解壓,沒有發(fā)現(xiàn)簽名文件,重新壓縮后V2簽名就失效, 由此可知:V2簽名是對整個APK簽名驗證
V2簽名優(yōu)點很明顯:
? ? ? ? 簽名更安全(不能修改壓縮包)
? ? ? ? 簽名驗證時間更短(不需要解壓驗證),因而安裝速度加快
關(guān)于簽名密鑰生成這里略去不表砖瞧,除了在android studio中生成息堂,也可以使用keytool去創(chuàng)建,我這里使用Debug時使用的默認密鑰 debug.keystore?
默認在C:\Users\用戶名\.android\debug.keystore
? ? 密鑰庫名:? debug.keystore
? ? 密鑰別名:? androiddebugkey
? ? 密鑰庫密碼: android
進入Android SDK/build-tools/SDK版本, 輸入命令,這里選擇的是28.0.3當前的最新版荣堰,應(yīng)該來說不要低于Android7.0(API24)都會有這個工具床未。
這里方便起見把debug.keystore和目標apk 都拷貝到同路徑下輸入以下指令:
輸入對應(yīng)key的密碼,運行完成后振坚,原來的應(yīng)用會被覆蓋薇搁,大小會發(fā)生改變,即簽名完成渡八。
apksigner使用起來較簡單啃洋,主要是一下幾個參數(shù),并且屎鳍,默認情況下V1,V2簽名都是打開的宏娄。
參數(shù):
????????--ks-key-alias密鑰別名,若密鑰庫有一個密鑰對,則可省略,反之必選
? ? ? ? --v1-signing-enabled 是否開啟V1簽名,默認開啟
? ? ? ? --v2-signing-enabled 是否開啟V2簽名,默認開啟
到此重打包、簽名完成逮壁,裝上apk即可看到效果孵坚。
本文主要是對該書中第二節(jié)使用signapk簽名出錯情況下的一種更新的方案。鑒于這本書距離第一次出版已經(jīng)過去很久窥淆,也算是對本書的一點點貢獻卖宠。