Почему бы не использовать AES для шифрования паролей в PHP? - PullRequest
18 голосов
/ 30 июня 2010

Везде, где я видел людей, говорящих о хранении паролей в базе данных, они почти всегда использовали MD5.

Что не так с AES или SHA1?

Ответы [ 6 ]

36 голосов
/ 30 июня 2010

Если вы храните пароль в зашифрованном виде, его можно расшифровать.Поскольку многие люди используют пароли в разных системах, это плохо.Таким образом, вы используете одностороннюю функцию, криптографическую хеш-функцию - таким образом пароль можно проверить без фактического раскрытия.

Как прокомментировал Грег, AES - это алгоритм шифрования / дешифрования.MD5 и семейство SHA являются хеш-функциями, которые являются более подходящими для использования.Но держитесь подальше от MD5 в настоящее время - на самом деле он уже не выглядит достаточно безопасным .Сяоюнь Ван опубликовал эффективную атаку против него в 2005 году, и теперь его сила значительно ниже расчетной прочности - таким образом, в криптографических терминах она «сломана».и хэшируйте пароль для его хранения - используйте эти термины в тандеме, и вы найдете множество ссылок.

6 голосов
/ 30 июня 2010

MD5 (алгоритм Message-Digest 5) - криптографическая хеш-функция, в то время как Advanced Encryption Standard (AES) - алгоритм шифрования с симметричным ключом, поэтому они используются для различных цели. Хеш, такой как MD5 или SHA, используется для проверки паролей, потому что его трудно инвертировать, то есть получить пароль из хеш-строки. Шифрование AES, с другой стороны, обратимо, исходное сообщение можно получить, если вы знаете ключ. Таким образом, если несколько сообщений зашифрованы одним и тем же ключом, зная, что он раскрывает их все, тогда как, если вам удастся найти исходную строку хеша (радужные таблицы и т. Д.), Вы обнаружили только простой текст для этого конкретного экземпляра, и вам придется переделать работу, чтобы найти решение для другой хеш-строки.

4 голосов
/ 30 июня 2010

Короче говоря: AES является обратимой.Хеш-функция отсутствует.

В ответ на принятый ответ ... (извините, я новый пользователь, пока не могу оставлять комментарии ...) Соль только предотвращает атаки на основе Rainbow Table.Он не защищает "слабые пароли".Чтобы защитить более слабые пароли, вам нужно будет использовать хеш-функцию, которая оказалась медленной.Правильно настроенный bcrypt - это самый простой способ сделать это.MD5 и SHA1 слишком быстры, чтобы быть в безопасности.(Столкновения, обнаруженные с MD5, не связаны с этой проблемой, которую я описываю)

Все 8-символьные пароли, зашифрованные с помощью MD5 или SHA1 (даже если они правильно посолены), могут быть взломаны этот чувак за один раздень .Соление НЕ предотвращает такого рода атаки.«Оптимизация» атаки будет состоять только из ~ 500 тыс. Слов в английском языке ... и 10 000 наиболее распространенных их вариантов взломают огромное количество паролей.

BCrypt сильнее против такой атакипотому что он (может быть настроен) в миллионы раз медленнее, чем MD5.Итеративное использование MD5 миллион раз теоретически позволит добиться того же, но я предлагаю вам придерживаться хорошо протестированных библиотек, а не использовать собственную реализацию.BCrypt, конечно, также использует Salting и доступен на большинстве языков программирования.Так что нет причин НЕ использовать его.

Теоретически, SCrypt лучше, но он слишком новый (и поэтому реализации, вероятно, все еще немного глючат)

Короче говоря: SHA512 против Blowfish и Bcrypt

1 голос
/ 30 июня 2010

Основная причина, по которой использование симметричного (или асимметричного) шифрования не рекомендуется для защиты паролей: управление ключами . При использовании шифрования вы должны защищать ключ шифрования (или энтропии, из которых этот ключ получен). И защита ключа - очень сложная задача. Хеширование (с SHA, MD5 или любым другим алгоритмом) решает проблему защиты ключа, потому что вам не нужно хранить какое-либо секретное значение (кроме соли, но соль значительно менее чувствительна, чем ключ шифрования; вы можете хранить соль в простой текст). Так что, если вы храните пароли только для целей аутентификации (выполняемых вашим приложением), нет абсолютно никакой причины использовать шифрование; хэширование подойдет просто отлично. Однако могут быть случаи, когда вам необходимо иметь возможность расшифровывать пароли (например, вам может понадобиться передать учетные данные пользователей в сторонние приложения ). Это единственный случай, когда использование шифрования будет оправдано для хранения пароля.

1 голос
/ 30 июня 2010

Использование AES в качестве симметричного шифра для паролей будет иметь значение CWE-257 и может привести к уязвимости.В качестве хэш-функции можно использовать симметричный шифр.Старые пароли Unix используют DES в качестве хэш-функции, а новые системы Unix используют Blowfish в качестве хэш-функции.Но даже несмотря на то, что он является блочным шифром, он используется в качестве односторонней функции, что является обязательным требованием для любой системы хранения паролей.

Для php вы должны использовать sha256 .

1 голос
/ 30 июня 2010

Поскольку шифрование AES является симметричным.Учитывая пароль, зашифрованный с помощью AES и ключ, вы можете расшифровать пароль.Это нежелательно, потому что вы почти всегда хотите, чтобы его знал только владелец пароля, и не хотите иметь простой способ получить пароль.Алгоритмы SHA и MD5, с другой стороны, выполняют (в основном) одностороннее преобразование пароля.Нет информации (ключа), которая позволяла бы вам возвращать преобразованный пароль обратно в текстовую форму.

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