Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

Для PHP проверьте PHPPass http://www.openwall.com/phpass/

Для тех, кто использует .NET, посетите BCrypt.NET. http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

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

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


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

  • ША-256

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

  • пароль: password1
  • соль: PasswordSaltDesignedForThisQuestion

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

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");

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

Рассмотрите возможность использования bcrypt он используется во многих современных фреймворках, таких как laravel.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top