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

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

31 голосов
/ 03 августа 2008

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

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

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

Ответы [ 7 ]

31 голосов
/ 03 августа 2008

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

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

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

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

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

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

15 голосов
/ 03 августа 2008

Я с Питером. Разработчик, похоже, не понимает пароли. Мы все выбираем (и я тоже виноват в этом) 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

8 голосов
/ 17 сентября 2008

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

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


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

  • SHA-256

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

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

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

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
7 голосов
/ 17 сентября 2008

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

2 голосов
/ 16 июля 2016

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

1 голос
/ 05 августа 2008

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

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

0 голосов
/ 18 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...