Сравнение паролей со склепом () в PHP

Я должен получить основы этой функции. Состояния документации php.net, для алгоритма шифра, что:

Хеширование шифра с солью следующим образом: "a$ за 2$", две цифры стоили параметру, "$" и 22 основам 64 цифры от алфавита "./0-9A-Za-z". Используя символы за пределами этого диапазона в соли заставит склеп () возвращать строку нулевой длины

Таким образом, это, по определению, не должно работать:

echo crypt('rasmuslerdorf', '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringforsalt$');

Однако это выкладывает:

$2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e

Где кажется, что склеп () сократил саму соль к длине 22. Кто-то мог объяснить это?

Другой аспект этой функции, я не могу получить голову вокруг, - когда они используют склеп () для сравнения паролей. http://php.net/manual/en/function.crypt.php (смотрят на напр. № 1). Это означает, что, если я использую ту же соль для всего шифрования всех моих паролей, у меня есть к склепу он сначала? т.е.:

$salt = "usesomadasdsadsadsadae";
$salt_crypt = crypt($salt);

if (crypt($user_input, $salt) == $password) {
   // FAIL WONT WORK
}

if (crypt($user_input, $salt_crypt) == $password) {
   // I HAVE TO DO THIS?
}    

Спасибо за внимание

17
задан soren.qvist 28 June 2010 в 19:31
поделиться

4 ответа

Следующий пример кода может ответить на ваши вопросы.

Чтобы сгенерировать хэшированный пароль с помощью Blowfish, сначала нужно сгенерировать соль, которая начинается с $2a$, затем следует счетчик итераций и 22 символа строки Base64.

$salt = '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringfors';
$digest = crypt('rasmuslerdorf', $salt);

Храните весь $digest в базе данных, в нем есть и соль, и дайджест.

При сравнении пароля просто сделайте это,

  if (crypt($user_input, $digest) == $digest)

Вы повторно используете дайджест в качестве соли. crypt знает, сколько времени занимает соль из идентификатора алгоритма.

21
ответ дан 30 November 2019 в 12:50
поделиться

Первый вопрос:

Итак, это, по определению, не должно работать:

echo crypt ('rasmuslerdorf', '$ 2a $ 07 $ usesomadasdsadsadsadasdasdasdsadesillystringforsalt $');

Где кажется, что crypt () имеет резать сама соль длиной 22. Не мог бы кто-нибудь объяснить это?

Нет проблемы с наличием слишком большого количества символов ... фраза Использование символов вне этого диапазона в соли приведет к тому, что crypt () вернет строку нулевой длины [ относятся к диапазону вне диапазона по основанию 64 , а не к диапазону 22 символа . Попробуйте ввести недопустимый символ в строку соли, и вы должны обнаружить, что получите пустой вывод (или если вы поместите <22 символов, что приведет к недопустимым пустым байтам).

Второй вопрос:

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

0
ответ дан 30 November 2019 в 12:50
поделиться

Этот вопрос связан с моим ответом на ответ ZZ Coder. В основном мой вопрос касается сохранения результата crypt () в базе данных. Должен ли я хранить весь вывод в базе данных, чтобы моя база данных выглядела так:

--------------------------------------------------------------------------------
| ID | Username |                          Password                            |
--------------------------------------------------------------------------------
| 32 | testuser | $2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e |
--------------------------------------------------------------------------------

Если да, то разве это не противоречит цели использования соли в первую очередь? Если кто-то получает доступ к базе данных, он может ясно видеть соль, используемую для шифрования?

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

0
ответ дан 30 November 2019 в 12:50
поделиться

Цитата из руководства

CRYPT_BLOWFISH - Хэширование Blowfish с соль следующим образом: "$2a$", двузначная цифра параметр затрат, "$" и 22 base 64 цифры из алфавита

Примечание: 22 основание 64 цифры

2
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: