2

PHPを使用し、bcryptを使用する予定のSQLデータベースにパスワードを保存しています。

データベースにハッシュとソルトを格納するために使用する必要があるタイプとサイズを見つけるために、いくつかの調査を行っていました。

この質問に対する優れた回答に基づいて、bcrypt は異なるサイズのハッシュを出力することがあるようCHAR(76)ですBINARY(60)。しかし、いつ、なぜなのかわかりません。

その質問は、スキームを使用すると59バイトが生成され、60バイトが生成されるというリンクを提供します。ただし、php の暗号化に関する今日のドキュメントでは、何らかの理由でハイビット攻撃などの理由でoverを使用することを推奨しています。とにかく、推奨されているとおりに使用したいのですが、出力されるサイズの表示がありません。$2$$2a$$2y$$2a$$2y$

データベース内のフィールドのサイズはどのくらいにする必要がありますか?

また、この種のアプリケーションでCHARとの間に実際的な違いはありますか?BINARY

4

2 に答える 2

1
  1. ハッシュ:CHAR(60)
  2. 塩:CHAR(22)

これは実験的に見つけることができます:

<?php
    $salt1 = "FotZoGZruCl8ugk0Tvl4g";
    $salt2 = "FotZoGZruCl8ugk0Tvl4g9";
    $salt3 = "FotZoGZruCl8ugk0Tvl4g9a";

    print 'Salt 1 (stlen = ' . strlen($salt1) . '): ' . $salt1 . '<br />';
    print 'Salt 2 (stlen = ' . strlen($salt2) . '): ' . $salt2 . '<br />';
    print 'Salt 3 (stlen = ' . strlen($salt3) . '): ' . $salt3 . '<br />';

    $hash1 = crypt('password1', '$2y$07$' . $salt1);
    $hash2 = crypt('password1', '$2y$07$' . $salt2);
    $hash3 = crypt('password1', '$2y$07$' . $salt3);

    print 'Hash 1 (strlen = ' . strlen($hash1) . '): ' . $hash1 . '<br />';
    print 'Hash 2 (strlen = ' . strlen($hash2) . '): ' . $hash2 . '<br />';
    print 'Hash 3 (strlen = ' . strlen($hash3) . '): ' . $hash3 . '<br />';
?>

出力は次のようになります。

Salt 1 (stlen = 21): FotZoGZruCl8ugk0Tvl4g
Salt 2 (stlen = 22): FotZoGZruCl8ugk0Tvl4g9
Salt 3 (stlen = 23): FotZoGZruCl8ugk0Tvl4g9a
Hash 1 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4g.pXg.UBUUwuj14Ur1d.z/tMLqGPxQLBW
Hash 2 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe
Hash 3 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe

ここで、22 文字を超えてソルトに追加すると、ハッシュが変更されないことに気付くでしょう。つまり、crypt はハッシュを実行する前にソルトを 22 文字に切り捨てます。

参考までに、ランダムソルト生成:

$salt = substr(strtr(base64_encode(mcrypt_create_iv(17, MCRYPT_DEV_URANDOM)), "=+", "./"), 0, 22);

編集: また、ソルト/ハッシュの形式は base 64 です。これは、az、AZ、0-9、「.」を使用しています。および '/' は数字として、各数字は 0 から 63 までの値を表します...データベースでの使用は、でこれらの数字をすべて表すことができるためCHAR、 に関しては問題ありません。BINARYCHAR

于 2012-08-05T07:40:41.587 に答える
0

サイズは同じで、60 文字です。$2$(との唯一の違い$2a$は、前者が 1 文字少ないことです。実際のハッシュ部分は同じサイズです。)

于 2012-08-05T04:37:48.213 に答える