Ответ
Использование char[] вместо String для хранения конфиденциальных данных (паролей, PIN-кодов) — это рекомендация по безопасности, основанная на особенностях управления памятью в JVM.
Основные причины:
-
Немедленная очистка памяти.
- Массив
char[]можно явно перезаписать после использования, удалив конфиденциальные данные из памяти. - Объект
Stringнеизменяем (immutable). Присвоение новой строки илиnullне стирает старые данные в памяти — они останутся там до сборки мусора.
- Массив
-
Риск утечки в дамп памяти.
Stringчасто интернируются и хранятся в пуле строк (String Pool), который может быть выгружен в дамп памяти (heap dump) для отладки, что подвергает пароли риску.char[], как правило, не подвергается такой оптимизации.
-
Логирование и сериализация.
Stringможет быть неявно залогирован или сериализован (например, в thread dump), что приведет к утечке. Сchar[]такого не происходит.
Практический пример:
import java.util.Arrays;
public class PasswordStorage {
public boolean authenticate(char[] inputPassword) {
char[] correctPassword = getPasswordFromSecureStorage(); // 's','e','c','r','e','t'
// Сравнение с постоянным временем (защита от timing-атак)
boolean result = Arrays.equals(inputPassword, correctPassword);
// ВАЖНО: Немедленная очистка конфиденциальных данных из памяти
Arrays.fill(correctPassword, ' ');
Arrays.fill(inputPassword, ' ');
return result;
}
}
Рекомендации:
- Используйте
char[]для временного хранения пароля в памяти. - Немедленно перезаписывайте массив нулями (