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

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

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

18
задан Kevin Panko 29 June 2010 в 21:27
поделиться

6 ответов

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

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

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

36
ответ дан 30 November 2019 в 06:25
поделиться

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

6
ответ дан 30 November 2019 в 06:25
поделиться

Вкратце: AES обратимый. Хеш-функции нет.

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

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

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

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

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

5
ответ дан 30 November 2019 в 06:25
поделиться

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

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

1
ответ дан 30 November 2019 в 06:25
поделиться

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

1
ответ дан 30 November 2019 в 06:25
поделиться

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

1
ответ дан 30 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: