Java 代碼安全(一)
—— 避免用String儲存敏感數據
如果重要的數據(保存在內存中)在使用后沒有及時清理,有可能會導致信息泄漏。開發人員通常都回用String 保存敏感數據(密碼,卡號等)。因為String 對象是不可變的,只有 JVM 的垃圾回收器才能從內存中清除String的值。而只有內存不足的時候虛擬機才會執行垃圾回收,所以我們不能保證垃圾回收什么時候進行。當系統崩潰后,memory dump 可能會泄漏敏感數據。
這里解析一下String 對象不可變是什么意思
比如 String s1 = “abc”; s1 = “def”;
這里引用 s1 只是重新指向另外一個對象。對象”abc”並沒有被修改。
例子一:
Final char[] password = getPassword();
String passwordAsString = new String(password)
這里passwordAsString 不確定什么時候被清理掉,容易被泄露。
解決方案:
當重要數據不需要再使用的時候,保證把它清除掉。用byte 數組 或 character 數組來代替一些不可變的對象,比如String。應為byte 和 character 數組能用程序清理掉。
如:
Final char[] password = getPassword();
//use the password
…
//clear when finished
Arrays.fill(password,’’);
Memory dump : 內存轉存
用途:存一個當時內存的副本,可以用工具打開復原當時的情況。因為東西都在內存里。
附:java中String類的內存分配 http://jingyan.baidu.com/article/8275fc869a070346a03cf6f4.html