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

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

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

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

3.08.2008 11:50:33
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

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

32
16.05.2012 01:48:22

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

15
3.08.2008 13:48:25

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

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


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

  • SHA-256

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

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

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

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
8
3.07.2011 03:13:23
-1 SHA-256 не является функцией хеширования пароля и не является безопасным для этой цели. Он может быть частью одного (PBKDF2), но это совершенно другое. Также ваш пример вводит в заблуждение, потому что соль не должна быть умной фразой, это должно быть случайное (для пользователя) значение.
Brendan Long 20.09.2012 20:42:20

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

7
17.09.2008 18:16:58
Даже если вы криптограф, у него, вероятно, будет недостаток - потребуются годы, прежде чем алгоритм станет «популярным»
Tom Ritter 19.09.2008 16:03:35
Это так верно. И напоминает мне похожий анекдот от Дона Кнута в духе: давным-давно он пытался написать генератор случайных чисел и собрал столько непонятных операций, сколько мог придумать. Наконец он запустил это монументальное создание, и оно вывело номер 4 на неопределенный срок. (Детали могли быть изменены в пересказе.)
ndkrempel 16.05.2012 01:55:56

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

2
16.07.2016 07:47:48

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

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

1
4.08.2008 23:07:15
Пока это закрыто, вы все равно должны хэшировать пароли максимально безопасно. Какой самый простой способ получить пароль банковского счета кому-нибудь? Создайте потрясающий веб-сайт, на котором вы можете заставить людей зарегистрироваться. Большинство людей будут использовать существующие пароли. Теперь у вас есть огромный список паролей. В сущности, самый быстрый способ получить пароли других людей - это взломать ВАШУ систему, если бы я знал, что это плохая реализация.
Andrew T Finnell 29.12.2010 16:04:31

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

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

0
18.05.2018 18:27:40

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

}else{
echo "password not correct";
}

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

0
9.11.2019 10:05:17