Ответ
Класс String непригоден для хранения конфиденциальных данных (паролей, токенов) из-за особенностей управления памятью в JVM.
Проблемы с String:
- Неизменяемость (Immutability): Нельзя перезаписать значение. Пароль останется в памяти до сборки мусора.
- Пул строк (String Pool): Литералы и интернированные строки хранятся в пуле, что продлевает их жизнь и делает уязвимыми для утечек через дампы памяти.
- Логирование: Случайная передача
Stringв лог может привести к его записи в открытые файлы.
Решение: использовать char[]
char[] password = passwordField.getPassword();
try {
// Аутентификация...
authenticate(user, password);
} finally {
// Немедленная очистка памяти
Arrays.fill(password, ' ');
}
Преимущества char[]:
- Возможность ручной очистки массива нулями после использования.
- Не попадает в String Pool.
- Снижает риск утечки через дамп памяти.
Для хранения: всегда используйте адаптивные хеш-функции (bcrypt, scrypt, Argon2, PBKDF2), а не сырые пароли.