Почему бы не использовать AES для шифрования паролей в PHP?

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

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

Related of "Почему бы не использовать AES для шифрования паролей в PHP?"

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

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

Для достижения наилучших результатов стандартом является соль и хеш пароль для его хранения – google эти условия в тандеме, и вы найдете множество ссылок.

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

Короче: AES обратима. Хеш-функция – нет.

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

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

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

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

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

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

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

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

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