В каком типе данных в Java следует хранить пароли в памяти приложения?

«В каком типе данных в Java следует хранить пароли в памяти приложения?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для хранения паролей в памяти следует использовать массив символов 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) для каждого хеша.
  • Никогда не логируйте пароли или хеши в открытом виде.