android開發如何保障本地加密密鑰的安全?


首先要明白你的本地加密密鑰是用來加密什麼內容的,重要程度是什麼樣的。
其次評估密鑰被逆向出來會造成什麼風險。
最後分析下密鑰存儲的問題,有以下方法:
1、密鑰直接明文存在sharedprefs文件中,這是最不安全的。
2、密鑰直接硬編碼在Java代碼中,這很不安全,dex文件很容易被逆向成java代碼。
3、將密鑰分成不同的幾段,有的存儲在文件中、有的存儲在代碼中,最後將他們拼接起來,可以將整個操作寫的很複雜,這因為還是在java層,逆向者只要花點時間,也很容易被逆向。
4、用ndk開發,將密鑰放在so文件,加密解密操作都在so文件里,這從一定程度上提高了的安全性,擋住了一些逆向者,但是有經驗的逆向者還是會使用IDA破解的。
5、在so文件中不存儲密鑰,so文件中對密鑰進行加解密操作,將密鑰加密後的密鑰命名為其他普通文件,存放在assets目錄下或者其他目錄下,接著在so文件裡面添加無關代碼(花指令),雖然可以增加靜態分析難度,但是可以使用動態調式的方法,追蹤加密解密函數,也可以查找到密鑰內容。

可以說在設備上安全存儲密鑰這個基本無解,只能選擇增大逆向成本。而要是普通開發者的話,這需要耗費很大的心血,要評估你的app應用的重要程度來選擇相應的技術方案。

所以建議不妨試試阿里聚安全阿里聚安全-應用更安全,用戶更安心
的安全組件,其中的安全加密功能提供了開發者密鑰的安全管理與加密演算法實現,保證密鑰的安全性,實現安全的加解密操作。同時從應用層、運行層、native層
提供多層次全方位立體防護,還有安全沙箱、白盒加密、底層加固
共同保證客戶端數據安全。攻防是不斷變化演進的,它能實時更新客戶端模塊
保證攻防對抗強度。

專業的事情交給專業的人來做,自己做自己的主要精力用來做自己熟悉的模塊。


正好最近也在研究這個,基本查閱的都是英文資料

使用Android自身的密鑰庫(KeyStore)是相對更安全的。一般都把密鑰存在密鑰庫里確保安全。關於密鑰庫為什麼更安全,給你下面兩個谷歌官方技術文檔:
http://developer.android.com/training/articles/keystore.html
(一,密鑰材料可以綁定安全硬體;二,密鑰材料無法導出設備;三,密鑰材料永遠不進入應
用進程,加解密和簽名時僅僅利用系統進程完成。最極端情況下即使應用進程被破解,攻
擊者也最多能用密鑰來加解密,但不能導出密鑰材料)

有個boolean返回值的API可以直接判斷密鑰是否被實施硬體加密:
http://developer.android.com/intl/zh-cn/reference/android/security/KeyPairGeneratorSpec.html
(所謂硬體加密,指加密到Trusted Execution Environment (TEE) or Secure Element
(SE)。TEE是主處理器上的一個隔離區域,SE是一個晶元,TEE比SE功能更強)


關於本地存儲秘鑰的不安全性, @justbei 解釋的很詳細,不再啰嗦. 秘鑰本地安全存儲有兩種解決方案, 硬體方案和軟體方案, 這兩種技術也可以結合起來, 當然成本也更大. 下面稍微解釋下軟體方案----白盒加密技術.
白盒加密技術的核心思想是把秘鑰隱藏起來, 加密執行過程中, 內存中不會出現秘鑰的值. 現在通用的技術是查找表技術, 即把秘鑰隱藏在查找表中,可以看看Chow的關於白盒AES的奠基性文章white-box cryptography and an aes implementation, 國內也有人做, 看看肖雅瑩的畢業論文"白盒密碼及AES與SMS4演算法的實現"可以對白盒加密有一個感性的認識. 所以, 通過查找表技術隱藏秘鑰, 使得攻擊者逆向也好, dump內存也罷, 就不會直接看到秘鑰的值, 這跟把秘鑰放到so中增加逆向分析難度有質的區別. 白盒加密的攻擊需要從數學理論上去分析, 這無疑會極大增加破解難度. 白盒加密的研究現狀是公布出來的論文並不多, 給你一個參考網址, http://www.whiteboxcrypto.com/. 我相信國內外都有安全公司和實驗室在研究白盒加密, 只不過都沒公布出來. 從移動互聯網到IoT領域, 終端安全問題會越來越突出, 預測白盒加密這種軟體解決方案會越來越重要, 因為成本更低. 白盒加密的安全度目前來看是可以值得信任的, 當然這個世界上沒有絕對的安全, 白盒加密也會被破, 就是攻擊成本的問題啦. 我覺得應對你的問題就是暫時足夠了.


拋開"破解難度"來說這個問題,基本上無解。
理論上存儲在Android設備中的任何內容都是可以搞到手的。

寫死,多套幾層殼,增大破解難度,僅此而已,無他


可以從加密技術上先了解下淺談安卓開發代碼混淆技術 - 李大師的文章 - 知乎專欄


推薦閱讀:

為什麼http後面加個s就可以實現加密?
瀏覽器地址欄里的 https 加密圖標,分別是什麼含義?
charles如何抓取https數據包的?
數字簽名、數字證書、SSL、https是什麼關係?
黑客說HTTPS不再安全,一種新攻擊可成功繞過,是噱頭還是實錘?

TAG:HTTPS | SSL證書 | 加密 | Android |