Каковы наилучшие методы шифрования паролей, хранящихся в MySql, с использованием PhP?

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

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

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

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

  • У kiddie есть полная копия базы данных.
  • У kiddie есть полная копия PHP, используемая для создания пароля и базы данных.

Любые советы по этой теме любезно оценены.

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Если ваши пользователи находятся в вашей сети, можете ли вы выполнять интегрированную безопасность?

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

Ответ 5

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

   salt
   hash(salt with password appended)

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