9

($currentYear - 2000)ムーアの法則を考慮してラウンド数を設定し、2013 年は13ラウンド数、したがって2^13総反復回数にするという推奨事項を見ました。もちろん、時間がかかりすぎないように、独自のハードウェアを考慮する必要があります (1 secondパスワード/ハッシュのチェックには「安全」であると推奨されており、現在のハードウェアでは 13 ラウンドがそのマークの周りにあります)。

それは、ソーシャル ネットワーキング タイプのサイトとしては理にかなっていると思いますか? または、将来的に を使用して非常に遅いパスワード チェックを設定することになります($currentYear - 2000)か?

また、ラウンド数が年ごとに変わった場合、どのように対処しますか?ラウンド数を変更してもハッシュが変更されないため、チェックで余分なラウンドが使用されるため、2013 年のハッシュを 2014 でチェックできなくなりますか? 毎年すべてのハッシュを再計算する必要がありますか、それとも正確にはどのように機能しますか?

4

3 に答える 3

16

まず、その推奨事項に疑問を呈します(年に基づいてコストを調整します)。コストは、現在の日付ではなく、ハードウェアの速度に基づいている必要があります。現在から 2015 年までの間にサーバーをアップグレードしなければ、コストを上げる理由はありません。あなたがすることは、すでに遅いプロセスを遅くすることだけです。

そうは言っても、ほとんどの用途で1秒という推奨事項にも疑問があります. 非常に機密性の高い情報を扱っている場合は、1 秒 (またはそれ以上) で十分です。しかし、平均的な Web サイトの場合、通常は 0.25 ~ 0.5 秒をお勧めします。場合によってはもっと下げることもできますが、強い正当な理由がなければそうはなりません。

さて、質問自体に。crypt()またはを使用するpassword_hash()と、反復回数が戻りハッシュ形式で格納されます。実は塩も同じです。したがって、ハッシュを計算するために必要なすべての情報が含まれています!

そして、これらの API (または私が維持しているポリフィル: password-compat ) のいずれも使用していない場合は、なぜ使用していないのか不思議に思う必要があります。独自のパスワード暗号を発明しないでください。強い理由がない限り、ネイティブ ハッシュを使用するライブラリ (phpass など) を使用しないでください (特定の政府のコンプライアンス上の理由、または PHP <= 5.2 との互換性のため)。

一般に、bcrypt は現在最も強力なハッシュ形式であると考えられています。SCrypt はより強力ですが、いくつかの問題があり、まだ非常に新しいものです (PHP コアではまだ利用できません)。したがって、bcryptを使用してください...

password_hash()APIには、あなたが求めていることを行うためのメカニズムがあります: password_needs_rehash(). 基本的に、ハッシュと現在使用しているオプションを渡すと、再ハッシュする必要があるかどうかがわかります。

if (password_verify($password, $hash)) {
    if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 14])) {
        $hash = password_hash($password);
        update_password_in_database($hash);
    }
    $loggedin = true;
}

詳細については、password_hash() の RFC を参照してください (多数の情報源からデータを収集し、RFC に参照を含めました)。

編集 - @AnotherParker のコメントをフォローアップ:

サーバーをアップグレードしなかったからといって、犯罪者がクラッキングボックスのアップグレードをやめることはありません。オフライン攻撃を阻止するには、時間の経過とともに作業パラメーターを増やす必要があります。

ある種の真実。確かにそうですが、私が上で話していたことの要点を逃しています。

ハッシュ関数のコスト パラメータは、時間と労力のトレードオフです。各ハッシュに追加の労力を追加するために、ある程度の時間をトレードオフします。同じハードウェアでは、時間がかかるほど、より多くの作業が発生します。より多くの作業を生み出すもう 1 つの方法は、より高速なハードウェアを入手することです。

しかし、推奨されるのは、現在のハードウェアでハッシュ関数をテストし、合理的に作成できる限り高価にすることです。サーバー ハードウェアをアップグレードしない限り、0.5 秒が現在許容できる最大値である場合、コストの増加はどのように役立つでしょうか? つまり、重要であるとすでに決めている最大時間制限を破ることになるため、そうではありません。

したがって、すでに弱いハッシュを生成していない限り、サーバーの機能を向上させずに作業パラメーターを増やすことはできません。

また、件名に関するこの回答を確認してください

于 2013-03-27T16:19:18.130 に答える
5

bcrypt を使用すると、ラウンド数は生成されるハッシュの一部になります。

crypt ( 'Password', '$2a$04$thisshallbemysalt' );

次のような結果になります

$2a$04$thisshallbemysalt.rAnd0ml0ok1ngch4rsh3re

2a最初の $ 記号は bcrypt アルゴリズムを表し、次の $ 記号は04ラウンド数を表します。したがって、ハッシュを見ると、作成が完了したラウンド数を確認できます。

したがって、ラウンド数を増やす時期だと判断した場合は、ユーザーがログインしたときに保存されたハッシュの生成に使用されたラウンド数を確認できます。現在のラウンド数でない場合は、そこでパスワードを再ハッシュし、次に、それを新しいハッシュとして保存します(もちろん、パスワードが既存のハッシュと一致するかどうかを確認した後;-))

于 2013-03-27T15:57:11.100 に答える
4

キー ストレッチングの考え方は、ブルート フォーシングを実行不可能にすることです。これは、ハッシュを数百回または数千回計算すると、攻撃者のシステムで各ラウンドに同じ量の余分な時間がかかるためです。

1 秒かかるか、0.9 秒かかるか、2.5 秒かかるかはあまり重要ではありません。アイデアは、毎秒何百万ものパスワード ハッシュをブルート フォースすることは実行不可能だということです。実際のラウンド数ではなく、重要な要素です。

たとえば、SHA256 ハッシュを使用する場合、システムは 1 秒あたり X (たとえば 1,000,000) ハッシュを実行できます。キー ストレッチング (つまり、たとえば 500 回のハッシュ) により、このシステムを各パスワードの 1 秒あたりの試行回数を 1,000,000 / 500 = 2,000 まで下げることができます。効果的に攻撃者の速度を 500 分の 1 にします。750 ラウンドを使用すると... まさに! 攻撃者の速度を 750 分の 1 にします。ただし、ラウンド数を増やすと、システム、Web サイト、アプリケーションにも影響するため、「念のため」あまり高くなりすぎないようにします。ユーザーはログインが遅いと文句を言うでしょう!

これは、たとえば、SHA1/256/512、MD4/5 などは速度が最適化されていることに起因します。そして、攻撃者を遅らせることができるように、速度が最適化されたアルゴリズムは望ましくありません。したがって、数年に一度、ユーザーのログイン時間は依然として許容範囲内であるが、攻撃者の速度を十分に低下させて、ハッシュ (または少なくとも、すべてのアカウントではなく、はるかに少ないアカウントに集中するように強制するなど)。

ラウンド数を増やすと、CBroe が説明するように再ハッシュします。

誰が 2 ($currentYear - 2000)という推奨を思いついたのかはわかりません(情報源が知りたいです! 気にしないで、見つけました)。回答をよく読んで、この質問/回答も確認することをお勧めします。

あなたの bcrypt に 0.2 ~ 0.5 秒かかる場合 (これは、ログイン中に許容できる「遅延」です)、攻撃者は同じハードウェアで 1 秒あたり約 5 ~ 2 ハッシュをブルート フォースできることを意味します。彼女はおそらく5,000/2,000または5,000,000/2,000,000を多額に投資しています。それでも、160 ビット (SHA1)、256 ビット (SHA256)、さらには 448 ビット (bcrypt) の空間全体を許容時間 (または寿命) でブルート フォースすることはまだ実現可能ではありません。

于 2013-03-27T16:02:42.243 に答える