Каковы наилучшие методы шифрования паролей, хранящихся в 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), то и гадание дорого стоит.
Ответ 6
Это просто
store(sha256("somesalt" + password));
И никто не сможет отменить его:)
Смотрите также: https://stackoverflow.com/info/3897434/password-security-sha1-sha256-or-sha512