需求:
銀聯安全檢測:祕鑰如何處理。
級別:嚴重
條目::客戶端公鑰不能是是硬編碼在客戶端安裝包內!
破解原理:
祕鑰如果做成Base64或者做成文件直接一整段的放在java類或者asset中,這個就是硬編碼;應用程序在加解密時,使用硬編碼在程序中的密鑰,攻擊者通過反編譯拿到密鑰可以輕易解密APP通信數據;
修復建議:
密鑰加密存儲或者經過變形處理後用於加解密運算,切勿硬編碼到代碼中!
1、密鑰直接明文存在sharedprefs文件中,這是最不安全的。
2、密鑰直接硬編碼在Java代碼中,這很不安全,dex文件很容易被逆向成java代碼。
3、將密鑰分成不同的幾段,有的存儲在文件中、有的存儲在代碼中,最後將他們拼接起來,可以將整個操作寫的很複雜,這因爲還是在java層,逆向者只要花點時間,也很容易被逆向。
4、用ndk開發,將密鑰放在so文件,加密解密操作都在so文件裏,這從一定程度上提高了的安全性,擋住了一些逆向者,但是有經驗的逆向者還是會使用IDA破解的。
5、在so文件中不存儲密鑰,so文件中對密鑰進行加解密操作,將密鑰加密後的密鑰命名爲其他普通文件,存放在assets目錄下或者其他目錄下,接着在so文件裏面添加無關代碼(花指令),雖然可以增加靜態分析難度,但是可以使用動態調式的方法,追蹤加密解密函數,也可以查找到密鑰內容。
參考:
1、參考的博客: https://bbs.pediy.com/thread-210263.htm
2、銀聯安全檢測:https://open.unionpay.com/tjweb/product/detail?proId=8