web-dev-qa-db-ja.com

ハッシュアルゴリズムを「安全」にするものは何ですか?

this 興味深い質問を読んだ後、必要な場合にどの安全でないハッシュアルゴリズムを使用するかについては良い考えを持っているように感じましたが、代わりに安全なアルゴリズムを使用する理由がわかりませんでした。

では、違いは何ですか?出力はハッシュされたものを表す単なる乱数ではありませんか?一部のハッシュアルゴリズムが安全になる理由は何ですか?

19
CodexArcanum

安全とは、衝突を使用してエラーを引き起こそうとする人(つまり、2つのソースが同じ値にハッシュされるという事実)が困難を伴うことを意味します。

いくつかの特徴:

  • ハッシュを知って、その値にハッシュするファイルを作成することは困難です(バリアント、新しいファイルの一部と目的のハッシュが与えられます)

  • 同じ値にハッシュする2つの異なるファイルを構築することは困難です(バリアント、ファイルの一部が指定されています)

3
AProgrammer

これを読んでください http://www.codinghorror.com/blog/2012/04/speed-hashing.html それは私がこれまで説明できなかったよりもはるかによくすべてを説明します。以下は、質問に直接取り組む記事の中で最も重要な2つのヘッダーです。

  • 安全なハッシュは改ざん防止用に設計されています
    • 入力データに対する小さな単一ビットの変更で出力を根本的に変更します
  • 安全なハッシュは遅くなるように設計されています

最後の彼のTL; DRセクション:

ユーザーの場合:

すべてのパスワードが12文字以上、理想的にはそれ以上であることを確認してください。パスフレーズを採用することをお勧めします。パスフレーズは、パスワードよりも覚えやすく(タイプされていない場合でも)、長さが純粋な力によるブルートフォースからも非常に安全です。

あなたが開発者の場合:

BcryptまたはPBKDF2を排他的に使用して、セキュリティで保護する必要があるすべてのものをハッシュします。これらの新しいハッシュは、GPUでの実装が困難になるように特別に設計されています。他の形式のハッシュは使用しないでください。他のほとんどすべての一般的なハッシュスキームは、コモディティGPUの配列によるブルートフォースに対して脆弱であり、毎年高速かつ並列化され、プログラミングが容易になります。

3
Nate

主な違いはかなり単純です。通常のハッシュは、偶発的な衝突の数を最小限に抑えることを目的としており、プロセス全体の速度を落とさずにできる範囲で可能です。

誰かが最善を尽くして衝突を起こした場合でも、衝突を防ぐことを目的とした安全なハッシュ。一般に、衝突の可能性anyをより高速な操作と交換したくありません。実際、衝突を見つけることを難しくしなくても、操作を意図的に遅くすること自体にセキュリティ上の利点があります。

後者の例:ハッシュの計算に50ミリ秒かかる場合、通常のユーザーのログインには実質的な影響はありません(つまり、ほとんどのユーザーは、ログイン時に50ミリ秒の違いに気付かないでしょう)。同時に、攻撃者が辞書攻撃をしたい場合、1秒に20ハッシュしか生成できないのは深刻なハンディキャップです。言い換えれば、何らかの理由で、安全なハッシュのためには、遅い方が良いです。

3
Jerry Coffin

「安全な」ハッシュとは、ハッシュを作成するために使用されたメッセージの事前の知識なしに、公式で再現可能な方法で「なりすまし」するのが難しいと考えられるハッシュです。その情報は一般に秘密であり、したがってハッシュが必要であるため、これは認証での使用を目的としたハッシュ関数の優れた特性です。

メッセージM、ハッシュ関数hash()、およびhash(M)によって生成されたハッシュ値H(ビットL単位)が指定されている場合、ハッシュは一般に「安全」であると見なされ、以下のいずれも実行できません。 [〜#〜] o [〜#〜](2L)時間:

  • Hash()とHを指定して、Mを生成します(プリイメージ耐性)
  • Hash()とMが与えられると、異なるMを生成します2 そのようなハッシュ(M2)== H.(弱い衝突抵抗)
  • Hash()を指定して、任意のMを生成します1 そしてM2 そのようなハッシュ(M1)== hash(M2)。 (強い衝突抵抗)

さらに、「安全な」ハッシュは、次のようなハッシュ長Lを持つ必要があります。L コンピュータが特定の現在のハードウェアを実行するための実行可能なステップ数ではありません。 32ビット整数ハッシュは、21億の値しか持てません。プリイメージ攻撃(特定のハッシュHを生成するメッセージを見つける)にはしばらく時間がかかりますが、多くのコンピューター、特にコードブレーキングにチャーターされた政府機関の手に渡るコンピューターにとっては実行不可能ではありません。さらに、ランダムなメッセージとそのハッシュを作成して保存するアルゴリズムは、確率により、77,000のメッセージのみを試行した後、新しいメッセージごとに重複するハッシュを見つけるのに50%の打撃を与え、75%の確率でわずか110,000の後に複製します。 64ビットのハッシュでさえ、約50億個の値のみを試行した後でも、50%の確率で衝突します。これが、小さなハッシュに対する誕生日攻撃の威力です。対照的に、256ビットハッシュ(SHA-256)で衝突を探すコンピューターでは、15を試行するまで、次のメッセージが衝突する可能性が10分の1に達する可能性さえありませんデシロン数値(1.5 * 1034)。

暗号ハッシュに対する実証された攻撃のほとんどは衝突攻撃であり、衝突するメッセージを2未満で生成する機能を実証しましたL 時間(ほとんどは指数時間のままですが、指数を半分にすると、256ビットハッシュを128ビットと同じくらい簡単に解くことができ、128ビットと同じくらい簡単に解けるので、複雑さが大幅に減少します。 64ビットなど)。

ハッシュサイズが小さいことに加えて、ハッシュが明らかに安全でない可能性がある他の要因は次のとおりです。

作業量が少ない-ハッシュテーブルまたは他の「チェックサム」タイプの目的で使用するために設計されたハッシュは、通常、計算量が少なくなるように設計されています。これにより、総当たり攻撃がはるかに簡単になります。

「スティッキーステート」-入力の特定の追加バイトが与えられても、ハッシュ関数は、これまでのすべての入力の現在のハッシュ値が変化しない入力パターンになりがちです。 「スティッキーステート」を使用すると、衝突を簡単に見つけることができます。「スティッキーステート」ハッシュを生成するメッセージを特定すると、ハッシュを「スティッキーステート」に保つ入力バイトを追加することにより、同じハッシュを持つ他のメッセージを生成するのは簡単です。 」.

拡散-メッセージの各入力バイトは、同じように複雑な方法でハッシュ値のバイト間で分散する必要があります。特定のハッシュ関数は、ハッシュの特定のビットに予測可能な変更を作成します。これにより、衝突の作成が簡単になります。ハッシュを生成するメッセージが与えられた場合、予測可能に変化するビットにのみ影響する新しい値をメッセージに導入することにより、衝突を簡単に作成できます。

2
KeithS

目前のタスクに適したアルゴリズムを使用します。

CRCはエラー検出/訂正に使用されます。

SHA2などの暗号メッセージダイジェストは、暗号構造(デジタル署名、MAC、鍵導出/パスワードハッシュ関数)およびセキュリティプロトコルのビルディングブロックとして使用されます。

ハッシュテーブル/辞書/マップでは SipHash を使用します。

次のCVEエントリで証明されているように、安全でないハッシュアルゴリズムをハッシュテーブルで使用しないでください:CVE-2003-0364、CVE-2011- 4461、CVE-2011-4838、CVE-2011-4885、CVE-2011-4462、CVE-2011-4815、CVE-2012-0840、 CVE-2012-5371 、CVE-2012-5374 、CVE-2012-5375

0
Erwan Legrand