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

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

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

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

Победителем ПМСП (HHH) стал Argon2 . Хеширование паролей с помощью Argon2 – лучшая практика с 2016 года.

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

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

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

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

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

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

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

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

bcrypt на самом деле более безопасен. Смотрите: Достаточно с таблицами Rainbow: что вам нужно знать о безопасных схемах пароля

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

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

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

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

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

Соль и хэш.

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