Каковы лучшие методы шифрования паролей, хранящихся в MySql, с помощью PhP? - PullRequest
16 голосов
/ 21 декабря 2010

Я ищу совет о том, как безопасно хранить пароли в MySQL, используя PHP.

Не обращая внимания на ограничения самого PHP, я хочу узнать больше о засолке, хешировании и шифровании этих плохих парней.

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

Есть два сценария, которые мы рассматриваем.

  1. У малыша есть полная копия базы данных.
  2. У малыша есть полная копия PHP, использованного для создания пароля, и база данных.

Любые советы по этой теме приветствуются.

Ответы [ 6 ]

17 голосов
/ 21 декабря 2010

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

Любой известный и широко поддерживаемый алгоритм хеширования будет иметь такой же основной «недостаток» (если вы можете так его назвать; это действительно по определению). Разница в том, что при выполнении операции хеширования bcrypt медленнее, чем патока , что делает атаку методом грубой силы намного менее эффективной.

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

8 голосов
/ 21 декабря 2010

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

  • Имя пользователя (в открытом тексте)
  • Соль (случайная строка)
  • Соленый хеш ( sha1 (имя пользователя + соль + пароль))

Используя схему, злоумышленник не может использовать против вас радужные таблицы , и пароли не могут быть восстановлены никакими (разумными) способами.(То есть, пока ваш злоумышленник не является правительством)

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

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

Объедините это с использованием bcrypt согласно ответу Donut, и вы действительно вполне безопасны.То есть:

  • Имя пользователя (в текстовом виде)
  • Соль (случайная строка)
  • СоленыйХеш ( bcrypt (имя пользователя + соль + пароль))
3 голосов
/ 21 декабря 2010

Принимая советы от здесь , для дополнительного удовольствия вы также можете динамически менять свою соль. Например, используйте разные соли для имен пользователей разной длины, в качестве соли используйте дату регистрации пользователя. Это делает так, что даже если кто-то ДОЛЖЕН получить доступ к вашей базе данных, он не может просто заново сгенерировать хеш, он должен вычислить хеш-таблицу для каждой соли, которую вы использовали.

1 голос
/ 21 декабря 2010

Все просто

store(sha256("somesalt" + password));

И никто не сможет повернуть его вспять:)

Смотри также: https://stackoverflow.com/questions/3897434/password-security-sha1-sha256-or-sha512

1 голос
/ 21 декабря 2010

Обычно «соленые» пароли (как в bcrypt) означают, что не сам пароль хранится, а только что-то вроде

   salt
   hash(salt with password appended)

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

1 голос
/ 21 декабря 2010

Если ваши пользователи находятся в Интернете, OpenId будет одним из ваших лучших вариантов. http://openid.net/

Если ваши пользователи в вашей сети, можете ли вы использовать встроенную защиту?

Другими словами .. не храните свои пароли.

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