Почему нельзя хранить пароли в базе данных в открытом виде
Что проверяют
Отличаете ли вы хеширование от шифрования и можете ли назвать конкретные алгоритмы и инструменты вместо рассуждений о важности безопасности. Это вопрос-фильтр: по нему видно, писали ли вы аутентификацию сами.
Как отвечать
Пароль не нужно уметь прочитать, нужно уметь проверить. Поэтому не шифрование, которое обратимо и требует хранить ключ, а односторонняя функция.
Обычный быстрый хеш тоже не подходит. MessageDigest с SHA-256 считается миллиардами раз в секунду на видеокарте, и перебор словаря по украденной базе занимает часы. Нужны специально медленные функции с настраиваемой стоимостью: Argon2id, bcrypt, scrypt или PBKDF2, если ограничивают сертифицированным списком.
Соль уникальна для каждого пользователя и хранится рядом с хешем. У bcrypt и Argon2 она уже входит в итоговую строку вместе с параметрами. Соль не секрет, её задача обесценить заранее посчитанные таблицы и сделать одинаковые пароли разными записями в базе. Дополнительно заводят перец, общий секрет вне базы, тогда утечка одного дампа без конфигурации бесполезна.
В Java это BCryptPasswordEncoder или Argon2PasswordEncoder из Spring Security, а лучше DelegatingPasswordEncoder: он пишет имя алгоритма префиксом прямо в строку хеша, поэтому переезд на другой алгоритм делается постепенно, перехешированием при очередном успешном входе.
Где спотыкаются
Называют хеширование односторонним шифрованием. Шифрование по определению обратимо, у него есть ключ и расшифрование. Смешение терминов обычно тянет за собой предложение «зашифровать пароли в базе», что решает не ту задачу.
Останавливаются на SHA-256 с солью и считают, что этого достаточно. Соль спасает от радужных таблиц, но не от перебора конкретного хеша, а скорость алгоритма тут и есть уязвимость.
Помнят про bcrypt, но не про его ограничение в 72 байта: длинная парольная фраза молча обрезается, и хвост не проверяется. Туда же держать пароль в памяти как String, а не как char[], и оставлять его в логах через автоматически сгенерированный toString.