これをユーザーパスワードシステムに使用しようとしていますが、最初に正しく行っていることを確認したいと思います。ここに私のテストコードがあります:
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$'
$
ありがとう