Я собираюсь использовать это для системы паролей пользователей, но сначала хочу убедиться, что делаю это правильно. Вот мой тестовый код:
function generateBlowfishSalt() { $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./'; $numChars = strlen($chars); $salt = ''; for($i = 0; $i < 22; ++$i) { $salt .= $chars[mt_rand(0, $numChars - 1)]; } return $salt; } $password = 'foo'; $salt = generateBlowfishSalt(); $hash1 = crypt($password, '$2a$12$' . $salt); $hash2 = crypt($password, $hash1); $compare = ($hash1 == $hash2); printf('password: %s</br>', $password); printf('salt: %s</br>', $salt); printf('hash1: %s</br>', $hash1); printf('hash2: %s</br>', $hash2); printf('compare: ' . $compare);
Вот пример вывода:
password: foo salt: MYVJ32OqLcMGBar3pUa.0S hash1: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q hash2: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q compare: 1
Мои основные вопросы:
Правильно ли я генерирую 22-символьную соль? Некоторые реализации, которые я видел, используют
base64_encode()
для генерации соли. Нужно ли мне это делать?Правильно ли хранить все значение
$hash1
в базе данных, а не хранить отдельное значение соли, поскольку$hash1
будет содержать соль, и это все, что мне нужно для проверки пароля?На странице документа PHP
crypt()
примерCRYPT_BLOWFISH
имеет конечный$
для аргумента соли (это:'$2a$07$usesomesillystringforsalt$'
). Но во всех примерах, которые я видел, никто не использует конечный$
. Это необязательно?
Спасибо