上個月公司一個項目突然要找第三方進行安全漏洞的檢測,于是打包了一個apk文件,發(fā)到第三方結(jié)構(gòu)進行了安全檢測,這項目我入職前就已經(jīng)快完成的階段,我后面基本是維護和小更新.比較坑的是之前的哥們連混淆都沒有,更不要說加固了,最后掃出了30多個漏洞,看到檢測報告都懵逼了.
自己對混淆和加固之前也只是知道皮毛沒有深究,這次修復漏洞踩了不少坑,都是邊上網(wǎng)搜資料邊踩坑,總算搞定了,寫出來防止后人踩坑,這里主要講加固簽名的坑,混淆這里不說了(自己對混淆還不熟)
混淆簽名導出
-
Q: 進行混淆,怎么混淆?
A: 我也是不太熟簡單說一下自己的做法,先google一下常用的第三方框架的混淆代碼找到自己需用的,剩下不常用的就上項目引用的框架對應的github項目地址找對應的混淆代碼.
-
Q: 導出的時候怎么選v1和v2?區(qū)別在哪?
A: 我自己是把v1和v2都勾上,區(qū)別是v1是7.0之前就存在的簽名方式,v1相比v2安全系數(shù)要低,建議打包的時候v1和v2都勾上,只勾其中一個有可能會出現(xiàn)兼容問題,具體自己上網(wǎng)查
加固
-
Q: 怎么加固?
A: 網(wǎng)上很多加固方式 (360,愛加密,梆梆..)都是傻瓜式的操作,可以找自己合適的.
-
Q:加固有哪些坑?
A: apk進行加固之后簽名信息都會丟失,加固完成之后要對apk重新進行簽名,沒有簽名的apk是不能在手機上跑的
A: 我開始用的是某數(shù)字公司的加固,加固完重新簽名就發(fā)給第三方機構(gòu)檢測了,報告說我沒有進行v2簽名,一直很懵逼,明明勾了v2的簽名為什么一直說我沒進行v2簽名,最后發(fā)現(xiàn)原來有些公司的提供的簽名工具不支持v2簽名,你用了他的簽名工具他會說你簽名成功,但實際上他只進行了v1的簽名,真的很蛋疼,也不說明一下.
自己進行簽名檢查和加固后重新對apk進行簽名
檢查是否簽名成功:
方法1:利用android sdk自帶的工具
-
用命令行進入本地的Android sdk目錄(我用的是mac) 地址如下 cd /Users/用戶名/sdk/build-tools/27.0.3/lib
- 27.0.3是你的自己的sdk版本,不一定和我一樣
-
檢查是否簽名成功 java -jar apksigner.jar verify -v my.apk (my.apk為本地安裝包的路徑)
如果出現(xiàn):mac 下終端訪問文件出現(xiàn)“Permission Denied”解決方案的話:
一個文件有3種權(quán)限粹断,讀、寫希柿、可執(zhí)行养筒,你這個文件沒有可執(zhí)行權(quán)限,需要加上可執(zhí)行權(quán)限晕粪。
終端下先cd到該文件的目錄下,執(zhí)行命令 chmod a+x ./apksigner.jar(文件名)
-
重新執(zhí)行步驟2檢查是否有簽名,會出現(xiàn)下面類似的結(jié)果:
- Verifies
- Verified using v1 scheme (JAR signing): true //已進行v1簽名
- Verified using v2 scheme (APK Signature Scheme v2): false //沒有進行v2簽名
很容易理解,ture是已簽名,false是未簽名,都為true的話說明v1,v2都成功簽名了.
方法2:
用命令行進入GetApkInfo.jar文件目錄 cd /Users/xxxx/GetApkInfo.jar
-
執(zhí)行 java -jar GetApkInfo.jar my.apk檢查是否有v2簽名
如果出現(xiàn):mac 下終端訪問文件出現(xiàn)“Permission Denied”解決方案的話:
一個文件有3種權(quán)限巫湘,讀、寫衅斩、可執(zhí)行怠褐,你這個文件沒有可執(zhí)行權(quán)限,需要加上可執(zhí)行權(quán)限奠涌。
先cd到該文件的目錄下,執(zhí)行命令 chmod a+x ./apksigner.jar(文件名)
-
再次執(zhí)行 java -jar GetApkInfo.jar my.apk
執(zhí)行結(jié)果: 成功 應用信息: 包名: com.xxx.xx.xx 版本名: 2.0.1 版本號: 2 簽名文件MD5: e093xxxb53xxxxxf5bxxxe17xxx7d V1簽名驗證通過: true 使用V2簽名: true V2簽名驗證通過: true
如果你要確保自己沒用錯簽名文件(雖然一般不會這么智障)這種方法比較適合你,能看到已簽名的md5值
-
keytool -v -list -keystore /Users/xxxx/MyAPP/test.jks(路徑是你的進行簽名的秘鑰路徑)
有效期開始日期: Mon May 08 09:35:21 CST 2017, 截止日期: Fri May 02 09:35:21 CST 2042 證書指紋: MD5: E0:93:xx:xx:xx:22:xx:xx:xx:5F:xx:xx:xx:xx:15:7D SHA1: xx:xx:xx:xx:xx:xx:C0:A4:xx:33:6Exx02:80:xx:DA:xx:xx:5F:xx:C3 SHA256: 39:xx:3A:xx:xx:BA:xx:A8:6C:xx:D0:C6:xx:BC:xx:76:25:xx:xx:A3:86:xx:xx:A0:xx:E8:xx:xx:4F:xx:xx:9C 簽名算法名稱: SHA256withRSA 版本: 3
然后把兩個md5的值進行比對,如果一致說明你的簽名沒用錯秘鑰 - -||
4.手動進行簽名操作:
- 進入本地的sdk目錄 cd /Users/xxxx/sdk/build-tools/27.0.3/lib
- 執(zhí)行簽名操作:
java -jar apksigner.jar sign --ks /Users/xxxx/Desktop/key.jks --ks-key-alias test --ks-pass pass:123456 --key-pass pass:123456 --out /Users/xxxx/Desktop/簽名后的安裝包.apk /Users/xxxx/Desktop/需要進行簽名的安裝包.apk
上面的命令會執(zhí)行同時執(zhí)行v1,v2簽名
注意仔細看上的命令行:進了黑色加粗的文字需要替換成實際的信息
- 第一個加粗的是秘鑰的路徑
- 第二個是秘鑰的別名
- 第三個是秘鑰的密碼
- 第四個是秘鑰的密碼
- 第五個是進行了簽名的安裝包保存的路徑
- 第六個是需要進行簽名的安裝包路徑
說個小插曲,我們的項目找的是一個規(guī)模很大的公司進行檢測,開始用了網(wǎng)上的免費的加固工具加固拿去檢測,別人拿去測試之后全部都脫殼了,說這種免費的加固安全沒有保障,要用他們的加固服務可以解決,要收費..呵呵,因為項目比較特殊只能答應了,打包簽名了apk,發(fā)到他們那邊進行了加固后他們把apk發(fā)回來讓我重新簽名,簽名后apk用不了,閃退....老板說別人大公司應該不會出現(xiàn)這種小問題,是我的問題.恩,自己也懷疑是我的錯. 當天折騰到凌晨才下班,經(jīng)歷了上面的一頓折騰后發(fā)現(xiàn)v1,v2都簽名了,并且md5值也沒問題. 這時就有底氣的去質(zhì)問那家公司,最后發(fā)現(xiàn)是他們的加固出問題.
一般來說進行了上面的方法重新簽名并且檢查md5值沒錯,應該不會出問題了這時候可以去質(zhì)疑一下加固方的問題.
先寫這些記錄一下,后面有需要再更新,有什么問題可以在下面留言討論.