Что плохого в том, чтобы засолить пароль и зашифровать его самим паролем?
Это очень быстрая операция, позволяющая очень быстро проверять (т.е. «взламывать») пароли. То же самое относится и к простому хешированию с помощью алгоритма, подобного SHA-2. Правильный способ обработки паролей состоит в том, чтобы засолить и растянуть их (а не просто хешировать). «Растяжение» означает запуск их через алгоритм, требующий больших затрат времени, который называется KDF (функция извлечения ключей), например, PBKDF2 или scrypt.
Не менее важно, что созданный человеком пароль не может быть использован напрямую для шифрования с AES в любом случае,AES требует ключ точного размера (16, 24 или 32 байта), и для обеспечения безопасности этот ключ должен быть полностью случайным по всему пространству ключей. Генерируемые человеком пароли редко бывают правильной длины и никогда не бывают случайными во всем пространстве ключей (и потому, что люди - плохие генераторы случайных значений, и потому что 32 набираемых символа - это тривиальная доля всех возможных 32-байтовых ключей; чтобы правильно ввести такой ключ,«пароль» должен иметь длину около 40 символов и вводиться случайным образом с использованием всех прописных / строчных букв, цифр и символов на общей клавиатуре).
Правильный способ превратить сгенерированный человеком пароль включ заключается в том, чтобы запустить его через KDF (именно поэтому он называется «функцией вывода ключа»). Если все, что вас волнует, это проверка подлинности (проверка правильности пароля пользователя), то нет смысла добавлять дополнительный шаг шифрования. Вы можете просто работать с растянутым ключом.
Растянутый пароль (вывод KDF) - единственное, что должно быть отправлено на сервер. Затем сервер должен хешировать это значение еще раз, используя SHA-2, и сохранить его. Таким образом, ключ, который представляется серверу, не совпадает с ключом, хранящимся в базе данных, и даже если база данных украдена, его нельзя использовать для аутентификации на сервере.