4

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

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

私の主な質問は次のとおりです。

  1. 22 文字のソルトを正しく生成していますか? 私が見たいくつかの実装ではbase64_encode()、ソルトを生成するために使用されています。私はそれをする必要がありますか?

  2. $hash1値全体をデータベースに保存し、別のソルト値を保存しないのは正しいです$hash1か。ソルトが含まれているため、パスワードを確認する必要があるのはそれだけですか?

  3. PHPcrypt()ドキュメントページの例には、salt引数CRYPT_BLOWFISHの末尾があります(これは this: です)。しかし、私が見たすべての例では、誰も末尾の を使用していません。オプションですか?$'$2a$07$usesomesillystringforsalt$'$

ありがとう

4

1 に答える 1

0

あなたは正しく塩をしています。ただランダムでなければなりません。これをランダムに生成するには、さまざまな方法があります。日付時刻などに加えて使用する人もいます。また、長いソルトは、いずれにせよ切り捨てられるため、あまり意味がありません。少なくとも crypt() に関しては、一定の長さが必要です。少し余分なパディングで気分が良くなる場合は、それを選択してください.

データベースにソルトを保存するとします。私は最初それを理解するのに苦労しました。ソルトの要点は、可能なパスワードの膨大なリストを使用してパスワードをレインボー テーブルに登録するのに時間がかかるようにすることだけです。修正に加えて、同じパスワードが 2 つ以上ある場合にも役立ちます。もしそうなら、ランダムソルトのためにハッシュは依然として異なります。

crypt() については、PHP の php DOC と同じ長さになるまでテストを続けますが、正しいように見えます。

于 2012-05-20T02:23:34.410 に答える