これをユーザーパスワードシステムに使用しようとしていますが、最初に正しく行っていることを確認したいと思います。ここに私のテストコードがあります:
function generateBlowfishSalt() {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./';
$numChars = strlen($chars);
$ソルト = '';
for($i = 0; $i < 22; ++$i) {
$salt .= $chars[mt_rand(0, $numChars - 1)];
}
$ソルトを返します。
}
$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);
出力例を次に示します。
パスワード: フー ソルト:MYVJ32OqLcMGBar3pUa.0S hash1: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q hash2: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q 比較: 1
私の主な質問は次のとおりです。
22 文字のソルトを正しく生成していますか? 私が見たいくつかの実装では
base64_encode()、ソルトを生成するために使用されています。私はそれをする必要がありますか?$hash1値全体をデータベースに保存し、別のソルト値を保存しないのは正しいです$hash1か。ソルトが含まれているため、パスワードを確認する必要があるのはそれだけですか?PHP
crypt()ドキュメントページの例には、salt引数CRYPT_BLOWFISHの末尾があります(これは this: です)。しかし、私が見たすべての例では、誰も末尾の を使用していません。オプションですか?$'$2a$07$usesomesillystringforsalt$'$
ありがとう