さて、ハッシング手法の弱点についての議論から、私は、古き良き力ずくで破るのが効率的であるということを理解しました。
それで、問題は次のとおり
です。他のものよりもブルートフォースに対してより厳格なハッシュアルゴリズムはありますか?
パスワードをハッシュする場合。
さて、ハッシング手法の弱点についての議論から、私は、古き良き力ずくで破るのが効率的であるということを理解しました。
それで、問題は次のとおり
です。他のものよりもブルートフォースに対してより厳格なハッシュアルゴリズムはありますか?
パスワードをハッシュする場合。
ブルート フォースに対する唯一の保護は、ブルート フォースを実行するのに非常に長い時間がかかるという事実です。
ブルート フォースは、考えられるすべての入力文字列を調べて、一度に 1 つずつ試すだけで機能します。考えられるすべての組み合わせを単純に試すことから保護する方法はありません。
この質問は 10 年前のものですが、今では答えがわかりました。
はい、ブルートフォース防止アルゴリズムがあります。そのようなアルゴリズムの鍵は遅いことです。正しさが数ミリ秒で検証されれば害はありません。しかし、それはブルートフォースを大幅に遅くします。さらに、これらのアルゴリズムは、将来の CPU のパフォーマンスの向上に適応できます。そのようなアルゴリズムには、
特に PHP では、パスワードのハッシュにpassword_hash()関数を使用する必要があります。
入力スペースがブルート フォース攻撃を実行できるほど小さいことがわかっている場合は、ブルート フォース攻撃から保護するための 2 つのオプションがあります。
これが答えです。ハッシュ アルゴリズムの計算が遅くなればなるほど、入力空間のブルート フォーシングに対する影響を受けにくくなります。
(元の回答が続きます)
出力形式にビットを追加すると、単純なブルート フォース攻撃に対するアルゴリズムの強度が 2 倍になります。
しかし、それぞれが 1 秒あたり 1 兆回のハッシュを試行できる 1 兆台のコンピューターがあったとしても、128 ビットのハッシュをブルート フォースするのに 100 兆年以上かかることを考えてみてください。出力は、無駄に無駄にする価値はありません。
もちろん、ハッシュの入力のエントロピーが 128 ビット未満の場合は、入力を総当たり攻撃することができます。これが、多くの場合、総当たり攻撃でパスワード クラッキングを実行できる理由です (128 ビットのエントロピーを持つパスワードを実際に覚えている人は誰もいません)。 .
ブルート フォースは最悪の攻撃であり、ブルート フォースを証明できるものはありません...
現在、ブルート フォース攻撃の観点からは 80 ~ 90 ビットが暗号学的に安全であると見なされているため、衝突耐性ハッシュ関数が完璧な場合は 10 バイトしか必要ありませんが、そうではないため、より多くのビットを実行するだけです...
力ずくで証明できるものは何もないという証拠は、鳩の穴の原理にあります。
ハッシュ関数H
は任意のサイズの入力を許可し、入力のサイズが出力サイズを超えると[0,1]^n
一定の出力を出力するため、複数の入力によって生成できる出力が必ず存在します。[0,1]^k
n>k
正方形を 9 つのサブ正方形に分割して視覚化できます。
0 | 0 | 0
0 | 0 | 0
0 | 0 | 0
これらはあなたの9つの穴です。私たちはブルート フォース アタッカーです。攻撃するチャンスは無限にあります...ハトは無限にあります...しかし、衝突を見つけるにはせいぜい 10 羽しか必要ありません...
4匹のピジョンと優れた耐衝突ハッシュアルゴリズムの後:
P | 0 | 0
0 | P | P
0 | 0 | P
9匹のハトの後:
P | P | P
P | P | P
P | P | P
すべての穴が埋まっているため、10 番目のハトは必然的に衝突します。
しかし、誕生日のパラドックスと呼ばれる別の数値プロパティのおかげで、独立した選択の数が与えられると、すべての「穴」を埋めるよりもはるかに速く複製を見つけることができます。
ハッシュ アルゴリズムの出力を考えてみましょう。
MD5 (128 ビット) または SHA-1 (160 ビット) は、SHA-2 (224、384、さらには 512 ビット) よりも総当たり攻撃が容易です。
もちろん、アルゴリズムをさらに弱体化させる他の欠陥 ( MD5やSHA-1 のわずかな欠陥など) が存在する可能性があります。
Codeka が言ったように、ブルート フォース攻撃に対して 100% 安全なハッシュ アルゴリズムはありません。ただし、ハードウェア支援のパスワード クラッキング (GPU を使用してパスワードを試行する) を使用しても、十分に長いパスワードをクラッキングするのにかかる時間は天文学的なものです。8 文字程度のパスワードを使用している場合、ブルート フォース攻撃に対して脆弱になる可能性があります。しかし、さらにいくつかの文字を追加すると、解読にかかる時間が大幅に増加します.
もちろん、これは虹の攻撃から安全だという意味ではありません。これに対する解決策は、パスワードにソルトを追加し、プリイメージ攻撃に対して脆弱ではないハッシュ アルゴリズムを使用することです。
12 ~ 14 文字のソルト化されたパスワードを使用し、できれば sha2 アルゴ (または同等のもの) でハッシュされている場合、かなり安全なパスワードを取得できます。
すべての暗号化システムはブルート フォースに対して脆弱です。これの別の用語は「些細な攻撃」です。
ハッシュの簡単な説明は、私たちが使用するすべてのハッシュ アルゴリズムが無限のサイズの入力を受け入れ、固定サイズの出力を持つということです。これは避けられない衝突であり、sha256 のようなものを自然に見つけるには 2^256 操作が必要です。md5() には、衝突を見つけるための 2^39 番目の操作を行うショートカットがあります。
パスワードをより強力にするためにできることの 1 つは、salt を非表示にすることです。 パスワード ハッシュは、salt が取得されるまで解読できません。 John The Ripperには、任意のタイプのパスワード ハッシュを復元するために、Dictionary、Salt、および Password を指定できます。この場合、sha256() と md5() はほぼ同じ時間で中断します。攻撃者が塩分を持っていない場合、攻撃者はより多くの推測を行う必要があります。あなたのソルトが sha256 (32 バイト) と同じサイズである場合、(dictionary size)*2^256
1 つのパスワードを破るのに推測が必要になります。この塩の性質がCWE-760の基本です。