6

フグのハッシュを生成しようとしていますが、ソルトを生成するために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)));
}
4

2 に答える 2

6

mcryptを使用してソルトを作成します。

于 2012-04-16T23:40:40.823 に答える
4

あなたのソルトに mt_rand を使用することは十分に安全です。ただし、パスワードごとに異なるランダム ソルトを使用することは明らかです。

しかし、そうは言っても; ほとんどすべての自己実装パスワード ハッシュ システムは安全ではありません。安全なパスワードハッシュシステムを生成して維持するのに十分なほど精通している人はほとんどいません. 参考までに、いくつかの SO スレッドを読んでいただきたいと思います。

Php/パスワードのベスト プラクティス

塩の生成と PHP

自分で巻かないで

自分で転がさないことをお勧めします。限目。可能であれば、PHP 用のパスワードハッシュの PhPass の確立されたライブラリの使用を検討してください。利点には、実際のアプリケーションのテスト、高度に安全な実装、および非常に使いやすいことが含まれます。

于 2012-04-16T23:44:06.017 に答える