Шифрование паролей
Каков самый быстрый и безопасный способ шифрования паролей (желательно на PHP) и переносимо ли он, какой бы метод вы ни выбрали?
Другими словами, если я позже перенесу свой веб-сайт на другой сервер, будут ли мои пароли работать?
Как мне сказали, метод, который я использую сейчас, зависит от точных версий библиотек, установленных на сервере.
Ответов (8)8
Если вы выбираете метод шифрования для своей системы входа в систему, тогда скорость - не ваш друг, Джефф поспорил с Томасом Птачеком по поводу паролей, и пришел к выводу, что вам следует использовать самый медленный и самый безопасный метод шифрования, который вы можете себе позволить. .
Из блога Томаса Птачека:
Скорость - это именно то, чего вам не нужно в хеш-функции паролей.Современные схемы паролей атакуются с помощью дополнительных взломщиков паролей.
Дополнительные взломщики не вычисляют заранее все возможные взломанные пароли. Они рассматривают каждый хэш пароля индивидуально и загружают свой словарь через хеш-функцию пароля так же, как ваша страница входа в PHP. Взломщики радужных таблиц, такие как Ophcrack, используют пространство для взлома паролей; Дополнительные взломщики, такие как John the Ripper, Crack и LC5, работают со временем: статистика и вычисления.
Игра с парольной атакой оценивается по времени, необходимому для взлома пароля X. С радужными таблицами это время зависит от того, насколько большой должна быть ваша таблица и насколько быстро вы можете ее искать. С инкрементными взломщиками время зависит от того, насколько быстро вы можете запустить функцию хеширования пароля.
Чем лучше вы можете оптимизировать хеш-функцию пароля, чем быстрее работает хеш-функция пароля, тем слабее ваша схема. MD5 и SHA1, даже обычные блочные шифры, такие как DES, разработаны, чтобы быть быстрыми. MD5, SHA1 и DES - ненадежные хэши паролей. На современных процессорах необработанные строительные блоки криптографии, такие как DES и MD5, могут быть нарезаны битами, векторизованы и распараллелены, чтобы сделать поиск паролей молниеносным. Реализации ПЛИС с окончанием игры стоят всего несколько сотен долларов.
Используйте эту функцию при вставке в базу данных 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");