フグのハッシュを生成しようとしていますが、ソルトを生成するためにmt_rand()を頼りにするのが安全かどうか疑問に思っていましたか?
function blowfish($string, $salt = NULL, $iterations = '08')
{
if( ! $salt)
{
$seed = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 22; $i++)
{
$salt .= $seed{mt_rand(0, 63)};
}
$salt = '$2a$' . $iterations . '$' . $salt;
}
return crypt($string, $salt);
}
上記の文字 $seed は、許容される 64 文字のフグ塩のアルファベットです。これを使用してパスワードを生成および比較する予定です。
$password = 'my^$%#password';
$hash = blowfish($password);
if($hash = blowfish($password, $hash))
{
print "Matches\n";
print $hash . "\n";
}
編集
私はこれに気づきませんでしたが、@zerkmsの言うことは真実です. ソルトは、ハッシュにアクセスできるのと同じ時点で既知であるため、ソルトは再利用可能な事前計算された攻撃を防ぐためだけのものです。したがって、目標は非可逆的なソルトではなく、ランダムなソルトです。
それで、これで何か問題がありますか?
function blowfish($string, $salt = NULL, $iterations = '12')
{
return crypt($string, $salt ?: "$2a\$$iterations$" . md5(uniqid('', true)));
}
また、タイトルと上記のコードで述べたように、私は独自のハッシュ アルゴリズムを実装していません。
更新 2
ロードされている場合に mcrypt 拡張機能を使用すると、次のようになりuniqid
ます。
function blowfish($string, $salt = NULL, $iterations = '12')
{
return crypt($string, $salt ?: "$2a\$$iterations$" . base64_encode(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)));
}
アップデート 3
base64_encode は md5 よりも高速ですが、のような無効なフグ文字が含まれてい+
ます。だから今md5に変更しました。
function blowfish($string, $salt = NULL, $iterations = '12')
{
return crypt($string, $salt ?: "$2a\$$iterations$" . md5(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)));
}