String 對象不可變,只有 JVM 垃圾回收器才能從內存清除其值。GC 觸發時機不可控(通常在內存不足時),導致敏感數據(密碼、卡號)在內存中停留時間不可預期。若系統崩潰產生 Memory Dump(內存轉存),攻擊者可從中提取明文敏感信息。
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,大幅降低內存洩露風險。
存儲當時內存快照,供事後分析工具(如 MAT、VisualVM)打開復原現場。因為所有對象數據都在內存中,敏感信息極易被提取。
Java 中 String 類內存分配機制:百度經驗