Шифрование пароля с паролем против хеширования - PullRequest
1 голос
/ 22 октября 2019

Я создаю службу аутентификации для одного из наших внутренних инструментов, и после просмотра различных статей я могу обобщить их как

  • Не использовать шифрование, потому что закрытый ключ может поставить под угрозу все в случаенарушения.
  • Используйте хеширование с засолкой для хранения хешей и простого сравнения хешей. Таким образом, даже если хэши скомпрометированы, фактические пароли не могут быть получены.

Я понимаю, что все, что может привести к открытому текстовому паролю, является плохим, но мне просто интересно, почему никто не использует пароли для шифрованияпароли, скажем, AES256? Я имею в виду, поскольку это симметричное шифрование, у него нет никакого закрытого ключа. Таким образом, даже в случае нарушения действительные пароли не могут быть получены обратно. Что плохого в том, чтобы засолить пароль и зашифровать его самим паролем?

1 Ответ

3 голосов
/ 22 октября 2019

Что плохого в том, чтобы засолить пароль и зашифровать его самим паролем?

Это очень быстрая операция, позволяющая очень быстро проверять (т.е. «взламывать») пароли. То же самое относится и к простому хешированию с помощью алгоритма, подобного SHA-2. Правильный способ обработки паролей состоит в том, чтобы засолить и растянуть их (а не просто хешировать). «Растяжение» означает запуск их через алгоритм, требующий больших затрат времени, который называется KDF (функция извлечения ключей), например, PBKDF2 или scrypt.

Не менее важно, что созданный человеком пароль не может быть использован напрямую для шифрования с AES в любом случае,AES требует ключ точного размера (16, 24 или 32 байта), и для обеспечения безопасности этот ключ должен быть полностью случайным по всему пространству ключей. Генерируемые человеком пароли редко бывают правильной длины и никогда не бывают случайными во всем пространстве ключей (и потому, что люди - плохие генераторы случайных значений, и потому что 32 набираемых символа - это тривиальная доля всех возможных 32-байтовых ключей; чтобы правильно ввести такой ключ,«пароль» должен иметь длину около 40 символов и вводиться случайным образом с использованием всех прописных / строчных букв, цифр и символов на общей клавиатуре).

Правильный способ превратить сгенерированный человеком пароль включ заключается в том, чтобы запустить его через KDF (именно поэтому он называется «функцией вывода ключа»). Если все, что вас волнует, это проверка подлинности (проверка правильности пароля пользователя), то нет смысла добавлять дополнительный шаг шифрования. Вы можете просто работать с растянутым ключом.

Растянутый пароль (вывод KDF) - единственное, что должно быть отправлено на сервер. Затем сервер должен хешировать это значение еще раз, используя SHA-2, и сохранить его. Таким образом, ключ, который представляется серверу, не совпадает с ключом, хранящимся в базе данных, и даже если база данных украдена, его нельзя использовать для аутентификации на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...