web-dev-qa-db-ja.com

このコードスニペットはパスワードハッシュとソルトに十分ですか

パスワードをソルトおよびハッシュすることについて数日読んだ後、私はそれを行う方法を示す実際のコードを見つけました。これは私が見つけたものです:

$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(22));  
$hash = crypt($data, "$2a$12$".$blowfish_salt);  

これは良い方法ですか?

11
vinaya
  1. Php 5.5を使用する方が簡単です _password_hash_ 関数、または古いバージョンを使用している場合は 互換性ライブラリ
  2. _openssl_random_pseudo_bytes_はパフォーマンスの問題に悩まされることがあります。代わりにmcrypt_create_iv (size, MCRYPT_DEV_URANDOM)を検討してください。
  3. ソルトエンコーディングはトリッキーです。 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つの方法 を確認してください。

14
CodesInChaos

コードに問題はありません。ただし、私は常に可能な限りいつでも、パスワードハッシュに既製のライブラリを使用することを好みます。 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';
}
2
user10211

あなたはそれを正しくやっています。生成するソルトはランダムで十分な長さと見なされます(ソルトはパスワードごとに一意である必要があることに注意してください)。安全なパスワードハッシュアルゴリズムと見なされるbcryptも使用しています。

0
Lucas Kauffman