Подтвердить что ты не робот

Как создавать и хранить хэши паролей с помощью Blowfish в PHP

1) Как создать безопасные хэши Blowfish с паролями crypt()?

$hash = crypt('somePassword', '$2a$07$nGYCCmhrzjrgdcxjH$');

1a) Каково значение "$ 2a"? Означает ли это, что следует использовать алгоритм Blowfish?
1b) В чем смысл "$ 07"? Повышает ли значение более безопасный хэш?
1c) Каково значение "$ nGYCCmhrzjrgdcxjH $"? Это соль, которая будет использоваться? Должно ли это быть случайным образом сгенерировано? Hard-код?

2) Как вы храните хеши Blowfish?

echo $hash;
//Output: $2a$07$nGYCCmhrzjrgdcxjH$$$$.xLJMTJxaRa12DnhpAJmKQw.NXXZHgyq

2a) Какая часть этого должна быть сохранена в базе данных?
2b) Какой тип данных следует использовать для столбца (MySQL)?

3) Как проверить попытку входа в систему?

4b9b3361

Ответ 1

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

Для получения дополнительной информации см. http://www.openwall.com/articles/PHP-Users-Passwords - Я рекомендую использовать библиотеку phpass, поскольку она обрабатывает случайную соль для вас, в отличие от crypt(),

Ответ 2

1a) Сила шифрования - требование в диапазоне 4..31. См. http://php.net/manual/en/function.crypt.php

1b) См. 1a

1c) См. 1a. "соль" не должна быть случайной, или вы не сможете восстановить один и тот же хеш для данного входа - см. 3.

2a) Строго говоря, все, кроме хэша (в случае сбоя базы данных). Кроме того, сохраните соль в файле, недоступном под корнем документа веб-сервера и включите его. Установите его с самыми строгими разрешениями; в идеале, только для веб-хост-службы (например, apache), без прав на запись или выполнение. Менее строго говоря, зависит от того, насколько вы защищаетесь от хакеров. Не хранить соль просто усложняет жизнь; они все равно должны получить данные, которые вводят в алгоритм правильно, но почему это облегчает?

2b) VARCHAR (32) должен быть хорош для blowfish, если не хранить хэш

3) Предположим, что вы уже запустили правильный код предотвращения инъекций и т.д. , поэтому, пожалуйста, не просто скопируйте ниже слепое (и в идеале используйте PDO вместо расширения mysql). Нижеследующее относится к blowfish, SHA-256 и SHA-512, которые возвращают соль в хеш. Требуется модификация для других алгоритмов...

//store this in another file outside web directory and include it
$salt = '$2a$07$somevalidbutrandomchars$'

...

//combine username + password to give algorithm more chars to work with
$password_hash = crypt($valid_username . $valid_password, $salt)

//Anything less than 13 chars is a failure (see manual)
if (strlen($password_hash) < 13 || $password_hash == $salt)
then die('Invalid blowfish result');

//Drop the salt from beginning of the hash result. 
//Note, irrespective of number of chars provided, algorithm will always 
//use the number defined in constant CRYPT_SALT_LENGTH
$trimmed_password_hash = substring($password_hash, CRYPT_SALT_LENGTH);
mysql_query("INSERT INTO `users` (username,p assword_hash) VALUES '$valid_username', '$trimmed_password_hash'");

...

$dbRes = mysql_query("SELECT password_hash FROM `users` WHERE username = '$user_input_username' LIMIT 1");
//re-apply salt to output of database and re-run algorithm testing for match
if (substring($salt, CRYPT_SALT_LENGTH) . mysql_result($dbRes, 0, 'password_hash') ) ===
        crypt($user_input_username . $user_input_password, $salt) ) {
    //... do stuff for validated user
}