Java 代碼安全(一)      —— 避免用String儲存敏感數據


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM