Как создавать и хранить хэши паролей с помощью 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) Как проверить попытку входа?

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

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

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 }