パスワードをソルトおよびハッシュすることについて数日読んだ後、私はそれを行う方法を示す実際のコードを見つけました。これは私が見つけたものです:
$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(22));
$hash = crypt($data, "$2a$12$".$blowfish_salt);
これは良い方法ですか?
password_hash
_ 関数、または古いバージョンを使用している場合は 互換性ライブラリopenssl_random_pseudo_bytes
_はパフォーマンスの問題に悩まされることがあります。代わりにmcrypt_create_iv (size, MCRYPT_DEV_URANDOM)
を検討してください。ソルトエンコーディングはトリッキーです。 16進数ではスペースが最適に使用されず、通常のBase64では無効な文字が使用されます。
_$salt = substr(strtr(base64_encode($randomSalt), '+', '.'), 0, 22);
_
トリックを行う必要があります。
あなたが得るこれらを組み合わせる
_$binarySalt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$salt = substr(strtr(base64_encode($binarySalt), '+', '.'), 0, 22);
_
詳細については、 ircmaxellのブログでBCryptを台無しにする7つの方法 を確認してください。
コードに問題はありません。ただし、私は常に可能な限りいつでも、パスワードハッシュに既製のライブラリを使用することを好みます。 PHPの場合、優れた実装が PHPass にあります。
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );
検証も行われます。
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
あなたはそれを正しくやっています。生成するソルトはランダムで十分な長さと見なされます(ソルトはパスワードごとに一意である必要があることに注意してください)。安全なパスワードハッシュアルゴリズムと見なされるbcryptも使用しています。