Я должен получить основы этой функции. Состояния документации 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?
}
Спасибо за внимание
Следующий пример кода может ответить на ваши вопросы.
Чтобы сгенерировать хэшированный пароль с помощью Blowfish, сначала нужно сгенерировать соль, которая начинается с $2a$, затем следует счетчик итераций и 22 символа строки Base64.
$salt = '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringfors';
$digest = crypt('rasmuslerdorf', $salt);
Храните весь $digest в базе данных, в нем есть и соль, и дайджест.
При сравнении пароля просто сделайте это,
if (crypt($user_input, $digest) == $digest)
Вы повторно используете дайджест в качестве соли. crypt знает, сколько времени занимает соль из идентификатора алгоритма.
Первый вопрос:
Итак, это, по определению, не должно работать:
echo crypt ('rasmuslerdorf', '$ 2a $ 07 $ usesomadasdsadsadsadasdasdasdsadesillystringforsalt $');
Где кажется, что crypt () имеет резать сама соль длиной 22. Не мог бы кто-нибудь объяснить это?
Нет проблемы с наличием слишком большого количества символов ... фраза Использование символов вне этого диапазона в соли приведет к тому, что crypt () вернет строку нулевой длины [ относятся к диапазону вне диапазона по основанию 64 , а не к диапазону 22 символа . Попробуйте ввести недопустимый символ в строку соли, и вы должны обнаружить, что получите пустой вывод (или если вы поместите <22 символов, что приведет к недопустимым пустым байтам).
Второй вопрос:
Вы передаете зашифрованный сохраненный пароль как соль, потому что строка соли всегда появляется (по замыслу) в зашифрованной строке, и таким образом вы гарантируете, что у вас есть одна и та же соль для шифрования сохраненных и вводимый пользователем пароль.
Этот вопрос связан с моим ответом на ответ ZZ Coder. В основном мой вопрос касается сохранения результата crypt () в базе данных. Должен ли я хранить весь вывод в базе данных, чтобы моя база данных выглядела так:
--------------------------------------------------------------------------------
| ID | Username | Password |
--------------------------------------------------------------------------------
| 32 | testuser | $2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e |
--------------------------------------------------------------------------------
Если да, то разве это не противоречит цели использования соли в первую очередь? Если кто-то получает доступ к базе данных, он может ясно видеть соль, используемую для шифрования?
Дополнительный вопрос: безопасно ли использовать одну и ту же соль для каждого пароля?
Цитата из руководства
CRYPT_BLOWFISH - Хэширование Blowfish с соль следующим образом: "$2a$", двузначная цифра параметр затрат, "$" и 22 base 64 цифры из алфавита
Примечание: 22 основание 64 цифры