18

PHP 5.5がアルファ版であることは知っていますが、私が作成しているこのクラスは、function_exists()を使用してハッシュ機能を利用するために事前に作成されています。

password_hashドキュメントをチェックしました。3番目の引数は、現在2つのオプション「salt」と「cost」をサポートしている$options用です。

それは次のように述べています:

コスト。使用する必要のあるアルゴリズムコストを示します。これらの値の例は、crypt()ページにあります。

crypt()ページに移動すると、ドキュメントが表示されます。

次のようにソルトを使用したブローフィッシュハッシュ:「$ 2a $」、「$ 2x $」、または「$ 2y $」、2桁のコストパラメータ「$」、アルファベットからの22桁「./0-9A-Za -z」。ソルトでこの範囲外の文字を使用すると、crypt()は長さゼロの文字列を返します。2桁のコストパラメータは、基になるBlowfishベースのハッシュアルゴリズムの反復回数の2を底とする対数であり、範囲04〜31である必要があります。この範囲外の値では、crypt()が失敗します。5.3.7より前のバージョンのPHPは、ソルトプレフィックスとして「$ 2a $」のみをサポートします。PHP5.3.7では、Blowfish実装のセキュリティ上の弱点を修正するために新しいプレフィックスが導入されました。セキュリティ修正の詳細については、»このドキュメントを参照してください。ただし、要約すると、開発者はPHP5.3のみを対象としています。

頭を包み込むことができないようです。PHP5.3.7以降は$2y$を使用する必要があると書かれていますが、それを取得するためにどのようなコスト値を使用しますか?それを選択するのに最適な値ですか?彼らが提供する例では、値7を使用していますが、上記によれば、最大31になる可能性があります。たとえば、31ではなく4を使用すると、どのような違いがありますか?

4

2 に答える 2

18

関数password_hash()は function の単なるラッパーであり、crypt()正しく使用しやすくします。安全なランダム ソルトの生成を処理し、適切なデフォルト値を提供します。

この関数を使用する最も簡単な方法は次のとおりです。

$hash = password_hash($password, PASSWORD_DEFAULT);

つまり、関数は BCrypt (アルゴリズム2y) でパスワードをハッシュし、ランダムなソルトを生成し、デフォルトのコスト (現時点では 10) を使用します。これらは適切なデフォルト値です。特に、独自のソルトを生成することはありません。間違いを犯しやすいです。

コスト パラメータを変更する場合は、次のようにします。

$hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 11]);

コスト パラメータを 1 増やすと、ハッシュ値の計算に必要な時間が 2 倍になります。コスト パラメーターは、反復回数の対数 (基数 2) です。つまり、次のことを意味します。

$iterations = 2 ^ $cost;

編集:

独自のクラスを生成したいという点を見逃しました。PHP バージョン 5.3.7 以降の場合、関数を作成したのと同じ作者による互換性パックが存在しpassword_hash()ます。このコードを直接使用することも、巧妙に作成された実装を見ることもできます。5.3.7 より前の PHP バージョンでは、Unicode 対応の BCrypt アルゴリズムであるcryptwithがサポートされていません。代わりに、以前の PHP バージョンの最良の代替手段である を2y使用できます。2a私は多くのコメントを含むを作成しました。あなたもそれを見たいと思うかもしれません。

PS "salt" と "cost factor" という表現は で正しく使用されてpassword_hash()いますが、crypt() 関数では、すべての crypt パラメータに対して salt という単語が一緒に使用されていますが、これは少し誤解を招く可能性があります。

于 2012-12-17T10:30:55.163 に答える
1

免責事項:これは PHP 5.3.10のものですが、あなたの説明と実際には違いはないようです。

コストは、計算のコストに適用されます。コスト値を大きくすると、パスワードのハッシュに時間がかかります

function blowfish_salt($cost)
{
    $chars = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = sprintf('$2y$%02d$', $cost);
    for ($i = 0; $i < 22; ++$i)
        $salt .= $chars[rand(0,63)];

    return $salt;
}

$password = 'My perfect password';
$cost = $argv[1];
$salt = blowfish_salt($cost);
$hash = crypt($password, $salt);

これを私の(古い)マシンで実行すると

php mycrypt.php 10

すぐに(〜0.2秒)戻りますが、

php mycrypt.php 16

約5.2秒かかります。

于 2012-12-16T22:39:59.077 に答える