Шифрование паролей
Какой самый быстрый, но безопасный способ шифрования паролей (предпочтителен PHP), и какой метод вы выберете, является ли он переносимым?
Другими словами, если я позже перенесу свой сайт на другой сервер, мои пароли продолжат работать?
Метод, который я использую сейчас, как мне сказали, зависит от точных версий библиотек, установленных на сервере.
Ответы
Ответ 1
Если вы выбираете метод шифрования для своей системы входа в систему, скорость не является вашим другом, у Джеффа есть то же самое и с Томасом Птачеком о паролях, а заключение заключалось в том, что вы должны использовать самый медленный, самый безопасный метод шифрования, который вы можете себе позволить.
Из блога Томаса Птачека:
Скорость - это именно то, чего вы не хотите в хэш-функции пароля.
Современные схемы паролей подвергаются атакам с инкрементными взломами паролей.
Инкрементальные крекеры не предсказывают все возможные взломанные пароли. Они рассматривают каждый хэш пароля отдельно, и они передают свой словарь через хэш-функцию пароля так же, как и ваша страница входа в PHP. Радужные столовые крекеры, такие как Ophcrack, используют пространство для атаки паролей; инкрементные крекеры, такие как John the Ripper, Crack и LC5, работают со временем: статистика и вычисления.
Игра с парольной атакой забивается вовремя, чтобы взломать пароль X. С радужными столами время зависит от того, насколько велика ваша таблица и насколько быстро вы можете ее искать. С инкрементными взломщиками время зависит от того, насколько быстро вы можете запустить хеш-функцию пароля.
Чем лучше вы можете оптимизировать свою хэш-функцию пароля, тем быстрее будет работать хэш-функция вашего пароля, тем слабее ваша схема. MD5 и SHA1, даже обычные блок-шифры, такие как DES, предназначены для быстрой работы. MD5, SHA1 и DES - слабые хэши паролей. На современных процессорах необработанные криптоблочные блоки, такие как DES и MD5, могут быть битрейлерами, векторизованными и параллельными, чтобы сделать быстрый поиск пароля быстрым. Реализация FPGA для игр обойдется в сотни долларов.
Ответ 2
Я с Питером. Разработчик, похоже, не понимает пароли. Мы все выбираем (и я тоже виноват в этом) MD5 или SHA1, потому что они быстры. Думая об этом (ведь кто-то недавно указал мне на это), это не имеет никакого смысла. Мы должны выбрать алгоритм хеширования, который будет глупым. Я имею в виду, по масштабам вещей, занятый сайт будет хэш-паролями, что? каждые 1/2 минуты? Кого волнует, если он занимает 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
Ответ 3
Следует отметить, что вы не хотите шифровать пароль, вы хотите хэш.
Зашифрованные пароли могут быть дешифрованы, позволяя кому-либо увидеть пароль. Хеширование - это односторонняя операция, поэтому исходный пароль пользователя (криптографически) отсутствует.
Что касается алгоритма, который вы должны выбрать - используйте принятый в настоящее время стандартный вариант:
И когда вы вводите пароль пользователя, не забудьте также хеш в каком-то другом барахле. например:.
- пароль:
password1
- соль:
PasswordSaltDesignedForThisQuestion
Добавьте соль в пароль пользователя:
String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
Ответ 4
Что бы вы ни делали, не пишите свой собственный алгоритм шифрования. Выполнение этого почти гарантирует (если вы не криптограф), что в алгоритме будет недостаток, который сделает его тривиальным для взлома.
Ответ 5
Предположим использовать bcrypt
, он используется во многих современных фреймворках, таких как laravel.
Ответ 6
Я не обязательно ищу самый быстрый, но хороший баланс, некоторые из серверов, для которых этот код разрабатывается, довольно медленны, script, который хэширует и сохраняет пароль, занимает 5-6 секунд для запуска, и я сузил его до хэширования (если я прокомментирую хеширование, это выполняется через 1-2 секунды).
Это не должно быть MOST безопасным, я не буду тратить деньги на банк (прямо сейчас), но я, безусловно, НЕ БУДЕТ хранить пароли как обычный текст.
Ответ 7
password_hash ( string $password, int $algo [, array $options ] )
. (PHP 5> = 5.5.0, PHP 7)
password_hash() создает новый хэш пароля, используя сильный односторонний алгоритм хеширования. password_hash() совместим с crypt(). Следовательно, хэши паролей, созданные crypt(), могут использоваться с password_hash().
Ответ 8
В 2017 году сохранение пароля с помощью хеш-функции недостаточно. Пароль пользователя может быть взломан, применив таблицы таблицы поиска и радужных таблиц. Таблицы поиска и таблицы радуги работают только потому, что каждый пароль хэшируется точно так же. Мы можем предотвратить эти атаки путем рандомизации каждого хэша, так что, когда один и тот же пароль дважды хэшируется, хеши не совпадают.
Лучше итератировать по HMAC со случайной солью в течение приблизительно 100 мс и сохранить соль с хешем.
Защищенные алгоритмы хеширования: SHA-256, SHA-384, SHA-512
Популярные функции Хеширования пароля: PBKDF2, Rfc2898DeriveBytes, password_hash, Bcrypt, passlib.hash