Android開發(fā)中經(jīng)常會遇到需要在客戶端對一些敏感信息進行保存的情況,客戶端的加密信息食侮,關(guān)系到整個App是否安全的關(guān)鍵問題目胡。
常見的敏感信息隱藏策略主要有:
1誉己、敏感信息嵌套在string.xml中
安全性極低巨双,第三方只需要使用ApkTool等工具對Apk的資源進行反編譯,就能輕易地拿到這個資源文件袱蜡,里面的內(nèi)容是一目了然的慢宗。
2、敏感信息隱藏在Java源代碼中
將密鑰或者app_key 以字符串或者字符數(shù)組的形式硬編碼到代碼中敏晤,這也是普通開發(fā)者常用的方式
反編譯可以得到classes-dex2jar.jar 包嘴脾,這時使用JD-GUI 可以查看反編譯后的源碼蔬墩。
3、敏感信息隱藏在BuildConfig中
Android Gradle Plugin 為我們提供了BuildConfig 文件奏司,我們可以把敏感信息存在這里蔬蕊,同時通過將敏感信息存放在工程的gradle.properties中,可以避免將其上傳到版本控制系統(tǒng)(svn麻献、git)上猜扮,從而將敏感信息控制在少數(shù)人手里旅赢,而不是暴露給所有具有svn、git 權(quán)限的人煮盼。
這種方式安全級別也是比較低的僵控,對apk進行反編譯以后,查看BuildConfig.class 文件就可以看到APP_KEY 的值悠就。
4、使用DexGuard
Android 官方默認(rèn)集成了ProGuard,它是一個免費的用于壓縮荸型、優(yōu)化和混淆Java 字節(jié)碼的工具炸茧,混淆的功能主要是使用簡短的無意義的字母組合來對代碼中的類、字段踪宠、方法和屬性進行重命名妈嘹,但它無法對字符串進行混淆润脸。也就是說,使用ProGuard之后毙驯,我們還是可以看到反編譯后代碼的完整的字符串定義。
為了實現(xiàn)更高級的混淆和加密功能爆价,我們可以選擇商業(yè)版本的ProGuard-DexGuard.
DexGuard對代碼垦巴、資源、字符串铭段、AndroidManifest.xml等進行了全面的加密和混淆骤宣,相對PorGuard,功能強大了不少。
5序愚、對敏感信息進行偽裝或者加密
雖然DexPuard功能強大憔披,也能幫助我們對敏感字符串信息進行加密,但畢竟需要付費試用爸吮,并不是每個公司都會愿意付費芬膝。因此多數(shù)情況下,只能靠我們自己對Java代碼中的敏感信息進行偽裝或者加密形娇,以加大第三方破解的難度。最簡單的我們可以試用Base64對字符串進行編碼桐早,然后將編碼后的字符串和另外一串密鑰進行異或操作锈遥,從而得到偽裝后的字符串纫事。當(dāng)然,這個用于異或的密鑰如何存放所灸,就是一個先有雞還是先有蛋的問題了。
6炫七、敏感信息隱藏在原生函數(shù)庫中(.so文件)
為了增大第三方獲取敏感信息的難度爬立,我們可以進一步把敏感信息的存放從Java 層下移到Native 層,也就是存放在.so 文件中万哪。然后通過jni 封裝對敏感信息的獲取接口侠驯。至于敏感信息在c/c++層如何存放,我們可以重復(fù)Java層的偽裝和加密方式奕巍,另外可以在c/c++層通過花指令的方式來使得反匯編.so 文件的時候出錯吟策,來增加.so文件被破解的難度。
7的止、對APK 進行加固處理
近年來檩坚,涌現(xiàn)了很多APK 加固平臺,APK的加密處理極大地增加了反編譯的難度诅福,經(jīng)過加固平臺的加固后匾委,想使用普通的dex2jar、ApkTool 等工具進行反編譯幾乎都是失敗的氓润,這使得普通開發(fā)者再也無法輕易地偷窺發(fā)布在應(yīng)用市場的app 代碼或者資源了赂乐。