Шифрование паролей

Каков самый быстрый и безопасный способ шифрования паролей (желательно на PHP) и переносимо ли он, какой бы метод вы ни выбрали?

Другими словами, если я позже перенесу свой веб-сайт на другой сервер, будут ли мои пароли работать?

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

Ответов (8)

Решение

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

Из блога Томаса Птачека:
Скорость - это именно то, чего вам не нужно в хеш-функции паролей.

Современные схемы паролей атакуются с помощью дополнительных взломщиков паролей.

Дополнительные взломщики не вычисляют заранее все возможные взломанные пароли. Они рассматривают каждый хэш пароля индивидуально и загружают свой словарь через хеш-функцию пароля так же, как ваша страница входа в PHP. Взломщики радужных таблиц, такие как Ophcrack, используют пространство для взлома паролей; Дополнительные взломщики, такие как John the Ripper, Crack и LC5, работают со временем: статистика и вычисления.

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

Чем лучше вы можете оптимизировать хеш-функцию пароля, чем быстрее работает хеш-функция пароля, тем слабее ваша схема. MD5 и SHA1, даже обычные блочные шифры, такие как DES, разработаны, чтобы быть быстрыми. MD5, SHA1 и DES - ненадежные хэши паролей. На современных процессорах необработанные строительные блоки криптографии, такие как DES и MD5, могут быть нарезаны битами, векторизованы и распараллелены, чтобы сделать поиск паролей молниеносным. Реализации ПЛИС с окончанием игры стоят всего несколько сотен долларов.

Подумайте о том, чтобы использовать bcrypt его во многих современных фреймворках, таких как laravel.

Используйте эту функцию при вставке в базу данных Password_harsh ($ password, PASSWORD_DEFAULT); И при выборе из базы данных вы сравниваете пароль, который вы вставляете, с паролем в базе данных, используя функцию if (password_verify ($ password, $ databasePassword)) {

}else{
echo "password not correct";
}

Это будет жестким паролем в безопасном формате.

password_hash ( string $password , int $algo [, array $options ] ). (PHP 5> = 5.5.0, PHP 7)

password_hash() создает новый хэш пароля, используя надежный односторонний алгоритм хеширования. password_hash() совместим с crypt() . Следовательно, хэши паролей, созданные crypt() с помощью password_hash() .

Я с Питером. Разработчик, похоже, не понимает пароли. Мы все выбираем (и я тоже виноват) MD5 или SHA1, потому что они быстрые. Думать об этом (потому что кто-то недавно указал мне на это) не имеет никакого смысла. Мы должны выбрать глупо медленный алгоритм хеширования. Я имею в виду, что загруженный сайт будет хэшировать пароли? каждые 1/2 минуты? Какая разница, если это займет 0,8 секунды против 0,03 секунды с точки зрения сервера? Но эта дополнительная медлительность очень важна для предотвращения всех типов распространенных брутфорс-атак.

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

Для PHP проверьте PHP Pass

Для тех, кто занимается .NET, ознакомьтесь с BCrypt.NET.

Я не обязательно ищу самый быстрый, но хороший баланс, некоторые серверы, для которых разрабатывается этот код, довольно медленные, скрипт, который хеширует и хранит пароль, запускается 5-6 секунд, и я сузил его до хеширования (если я прокомментирую хеширование, которое он запускает, через 1-2 секунды).

Он не обязательно должен быть САМЫМ безопасным, я не кодирую банк (прямо сейчас), но я, конечно, НЕ БУДУ хранить пароли в виде простого текста.

Что бы вы ни делали, не пишите свой собственный алгоритм шифрования. Это почти гарантирует (если вы не криптограф) наличие в алгоритме изъяна, из-за которого его легко взломать.

Следует отметить, что вы не хотите шифровать пароль, вы хотите его хешировать .

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


Что касается того, какой алгоритм выбрать - воспользуйтесь принятым на данный момент стандартным:

  • SHA-256

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

  • пароль: password1
  • поваренная соль: PasswordSaltDesignedForThisQuestion

Добавьте соль к паролю пользователя:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");