Ответ
Для хранения паролей в памяти следует использовать массив символов char[] вместо String. Это связано с соображениями безопасности.
Почему char[] предпочтительнее String?
- Неизменяемость
String: ОбъектыStringнеизменяемы и могут долго оставаться в пуле строк (String Pool), что затрудняет их своевременную очистку сборщиком мусора. Злоумышленник, получивший доступ к дампу памяти, может извлечь из него пароли. - Возможность очистки
char[]: Массивchar[]можно явно перезаписать (заполнить нулями или случайными символами) сразу после использования, удалив конфиденциальные данные из памяти.
Пример безопасной обработки:
import java.util.Arrays;
public class PasswordExample {
public void processPassword() {
// Предположим, пароль получен из UI
char[] password = passwordField.getPassword();
try {
// Использование пароля (например, для хеширования)
// ...
} finally {
// Критически важно: очистка массива после использования
Arrays.fill(password, ' ');
}
}
}
Дополнительные best practices:
- Не храните пароли в открытом виде. Сохраняйте только криптографически стойкий хеш (например, с использованием алгоритмов bcrypt, scrypt, PBKDF2 или Argon2).
- Используйте уникальную соль (salt) для каждого хеша.
- Никогда не логируйте пароли или хеши в открытом виде.