首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 代碼安全實戰(一):為什麼不能用 String 存儲敏感數據

     編輯:Java 相關知識

核心問題

String 對象不可變,只有 JVM 垃圾回收器才能從內存清除其值。GC 觸發時機不可控(通常在內存不足時),導致敏感數據(密碼、卡號)在內存中停留時間不可預期。若系統崩潰產生 Memory Dump(內存轉存),攻擊者可從中提取明文敏感信息。

String 不可變性演示

String s1 = "abc";
s1 = "def"; // s1 只是重新指向新對象,"abc" 仍在內存中未被修改

錯誤示例

final char[] password = getPassword();
String passwordAsString = new String(password); // 危險:何時被清理不可控

解決方案:使用可變數組並主動清零

final char[] password = getPassword();
try {
    // 使用 password 進行業務操作
} finally {
    // 使用完畢立即清零
    java.util.Arrays.fill(password, '\0');
}

char[] 或 byte[] 可被程序主動覆寫,不依賴 GC,大幅降低內存洩露風險。

補充:Memory Dump 用途

存儲當時內存快照,供事後分析工具(如 MAT、VisualVM)打開復原現場。因為所有對象數據都在內存中,敏感信息極易被提取。

參考資料

Java 中 String 類內存分配機制:百度經驗

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved