Рекомендации: безопасный метод хранения паролей в таблице?

Я использую PHP. Раньше я использовал собственную функцию mysql function password() для хранения паролей. Мне сказали, что пароль() уже не безопасен. Какой был бы лучший способ хранения паролей в PHP? это MD5?

Ответ 1

Обновленный ответ 2016:

Победитель PHC (Конкурс Hays Hash) был Argon2. Хеширование паролей с помощью Argon2 - лучшая практика с 2016 года.

PHC работала с 2013 по 2015 год как открытый конкурс - такой же процесс, как NIST AES и SHA-3, и самый эффективный способ разработки криптового стандарта. Мы получили 24 кандидата, в том числе много отличных дизайнов, и один из победителей, Argon2, алгоритм, разработанный Алексом Бирюковым, Даниэлем Дину и Дмитрием Ховратовичем из Люксембургского университета.

Мы рекомендуем использовать Argon2 вместо устаревших алгоритмов.

Справочная реализация доступна в GitHub.

Обновленный ответ 2012:

Первоначальный ответ, который я дал ниже, когда-то считался лучшей практикой. Однако достижения в области технологий хэш-вычислений сделали эти схемы уязвимыми. Идти вперед, единственные безопасные схемы хэширования пароля - это итеративные хэши, такие как bcrypt и PBKDF2. Полный диалог см. В разделе анализ Джеффа Этвуда.

Оригинальный ответ 2009:

Я рекомендую сначала добавить к вашему паролю salt значение, а затем hashing в результате строки с достаточно сильной функцией хеширования, например SHA256. Это защищает от очевидных (простых текстовых паролей) и не столь очевидных (атака с использованием Rainbow tables).

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

Ответ 3

Вам нужно солить пароль.

vBulletin выполняет довольно хорошую работу по хранению паролей. md5 (md5 (пароль) + соль);

Ответ 4

Чтобы спорить с другим ответом, VBulletin делает ужасную работу по хешированию паролей. Их соль имеет длину всего 3 символа, лишь незначительно увеличивая безопасность вашего приложения.

Отъезд http://www.openwall.com/phpass/. Они отлично справляются с использованием длинного хэша, уникального для каждого пароля, и запускают пароль через md5 тысячи раз. Это одна из лучших хэширующих систем для php.

Ответ 5

Если вы можете избежать сохранения пароля пользователя, который наилучшим образом подходит, imo. Используйте OpenId (например, Stackoverflow) для аутентификации пользователя. Или Live Authentication (http://dev.live.com/liveid/). Если вы действительно действительно нуждаетесь в аутентификации пользователей самостоятельно; делайте то, что говорит Асаф в своем ответе.:)

Ответ 6

Соль и хэш.

Обычно мы используем случайный guid в качестве соли, а затем SHA512 для хеша.