質問

.NETフレームワークには、6種類のハッシュアルゴリズムが付属しています:

  • MD5:16バイト(ハッシュする時間500MB:1462ミリ秒)
  • SHA-1:20バイト(1644ミリ秒)
  • SHA256:32バイト(5618ミリ秒)
  • SHA384:48バイト(3839ミリ秒)
  • SHA512:64バイト(3820ミリ秒)
  • RIPEMD:20バイト(7066ミリ秒)

これらの各機能の実行方法は異なります。 MD5が最も速く、RIPEMDが最も遅い。

MD5には、組み込みのGuidタイプに適合するという利点があります。 これはタイプ3 UUIDの基礎です。 SHA-1ハッシュはタイプ5 UUIDの基礎です。識別に使いやすい。

MD5は衝突攻撃に対して脆弱ですが、SHA-1も脆弱ですが、少ない程度。

どの条件でどのハッシュアルゴリズムを使用する必要がありますか?

私が本当に知りたいと思う特定の質問は次のとおりです:

  • MD5は信頼されていませんか?通常の状況では、悪意のないMD5アルゴリズムを使用し、第三者に悪意がない場合、任意の衝突(同じハッシュを生成する2つの任意のバイト[]を意味します)を期待します

  • RIPEMDはSHA1よりもどれだけ優れていますか? (もしあれば)計算は5倍遅くなりますが、ハッシュサイズはSHA1と同じです。

  • ファイル名(またはその他の短い文字列)をハッシュするときに、悪意のない衝突が発生する可能性はどのくらいですか? (たとえば、同じMD5ハッシュを持つ2つのランダムなファイル名)(MD5 / SHA1 / SHA2xxを使用)一般的に、悪意のない衝突の可能性はどれくらいですか?

これは私が使用したベンチマークです:

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }


    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }
役に立ちましたか?

解決

暗号化では、ハッシュ関数は3つの別個の関数を提供します。

  1. 衝突耐性:同じハッシュを生成する2つのメッセージ(任意の 2つのメッセージ)を見つけるのはどれほど困難ですか。
  2. Preimage Resistance :ハッシュが与えられた場合、同じハッシュを持つ別のメッセージを見つけるのはどれくらい難しいですか? 一方向ハッシュ関数とも呼ばれます。
  3. 第2のプレイメージ耐性:メッセージがある場合、同じハッシュを生成する別のメッセージを見つけます。

これらのプロパティは関連していますが、独立しています。たとえば、衝突抵抗は、2番目のプリイメージ抵抗を意味しますが、その逆ではありません。特定のアプリケーションでは、これらのプロパティの1つ以上を必要とするさまざまな要件があります。サーバー上のパスワードを保護するためのハッシュ関数は通常、プリイメージ耐性のみを必要としますが、メッセージダイジェストには3つすべてが必要です。

MD5は耐衝突性ではないことが示されていますが、MD5は耐衝突性を必要としないアプリケーションでの使用を妨げるものではありません。実際、MD5は、キーのサイズと速度が小さい方が有益なアプリケーションで依然として使用されていることがよくあります。とはいえ、その欠陥のため、研究者は新しいシナリオで他のハッシュ関数の使用を推奨しています。

SHA1には、その長さの安全なハッシュ関数が必要とする2 ^ 80ステップよりも理論的にはるかに少ない衝突を検出できるという欠陥があります。攻撃は絶えず改訂されており、現在は約2 ^ 63ステップで実行できます-現在の計算可能性の範囲内でかろうじてです。このため、NISTはSHA1の使用を段階的に廃止し、SHA2ファミリは2010年以降に使用する必要があると述べています。

SHA2は、SHA1に続いて作成されるハッシュ関数の新しいファミリーです。現在、SHA2機能に対する既知の攻撃はありません。 SHA256、384、および512はすべてSHA2ファミリーの一部であり、異なるキー長を使用しています。

RIPEMD私はあまりコメントできませんが、SHAファミリほど一般的には使用されていないため、暗号研究者による綿密な調査は行われていません。その理由だけでも、SHA関数の使用をお勧めします。あなたが使用している実装では、それも非常に遅いようです。

結論として、最適な機能はありません-それはすべてあなたがそれを必要とするものに依存します。それぞれの欠点に注意してください。あなたのシナリオに最適なハッシュ関数を選択できます。

他のヒント

すべてのハッシュ関数は<!> quot; broken <!> quot;です。

pigeonholeの原則では、2つを超えることはできません。 2穴のハト(ハトを切り抜かない限り)。同様に、2 ^ 128 + 1個の数字を2 ^ 128スロットに収めることはできません。すべてのハッシュ関数は有限サイズのハッシュになります。つまり、<!> quot; finite size <!> quot;を検索すると、常に衝突を見つけることができます。 + 1シーケンス。そうすることは不可能です。 MD5用ではなく、かせ用ではありません。

MD5 / SHA1 / Sha2xxには偶然の衝突はありません

すべてのハッシュ関数には衝突があります。これは事実です。これらの衝突に偶然出くわすことは、銀河間宝くじに当たると同等です。つまり、誰も銀河間宝くじに当たらない、それは宝くじの仕組みではありません。偶発的なMD5 / SHA1 / SHA2XXXハッシュに遭遇することは決してありません。すべての辞書、すべての言語のすべての単語は、異なる値にハッシュされます。惑星全体のすべてのマシン上のすべてのパス名には、異なるMD5 / SHA1 / SHA2XXXハッシュがあります。どうやってそれを知るのか、あなたは尋ねるかもしれません。さて、私が前に言ったように、誰も銀河間宝くじに勝ちません。

しかし... MD5は壊れています

壊れていることは重要ではない場合がある

現状では、MD5でのプレイメージまたは2回目のプレイメージ攻撃はありません。 。

それでは、MD5の何がそんなに壊れているのでしょうか?第三者が2つのメッセージを生成する可能性があります。1つはEVILで、もう1つはGOODであり、両方とも同じ値にハッシュします。 (衝突攻撃

それにもかかわらず、現在のRSAの推奨事項では、プリイメージ耐性が必要な場合はMD5を使用しないことです。セキュリティアルゴリズムに関しては、注意を怠る傾向があります。

では、.NETで使用するハッシュ関数は何ですか?

  • 速度/サイズが必要で、誕生日攻撃やプレイメージ攻撃を気にしない場合は、MD5を使用します。

これを繰り返します。 MD5コリジョンはありません、悪意のあるコリジョンは慎重に設計できます。 MD5にこれまでに知られているプリイメージ攻撃はありませんが、セキュリティの専門家からの意見は、プリイメージ攻撃から防御する必要がある場合はMD5を使用しないことです。 SAMEはSHA1に適用されます

すべてのアルゴリズムがプリイメージ攻撃または衝突攻撃から防御する必要があるわけではないことに留意してください。 HD上の重複ファイルを最初に検索するという些細なケースを考えてみましょう。

  • 暗号的に安全なハッシュ関数が必要な場合は、SHA2XXベースの関数を使用します。

SHA512の衝突を発見した人はいません。今まで。彼らは本当に一生懸命努力しました。さらに言えば、SHA256や384の衝突を発見した人はいません。 。

  • 相互運用性のシナリオを除き、SHA1またはRIPEMDを使用しないでください。

RIPMEDは、SHAXとMD5が受け取ったのと同じ量の精査を受けていません。 SHA1とRIPEMDはどちらも誕生日攻撃に対して脆弱です。どちらも.NETのMD5よりも遅く、20バイトのサイズが厄介です。これらの関数を使用しても意味がないので、忘れてください。

SHA1の衝突攻撃は2 ^ 52にまで減少し、SHA1の衝突が自然に発生するまでそれほど長くはなりません。

さまざまなハッシュ関数に関する最新情報については、ハッシュ関数動物園

しかし、もっと待ってください

高速ハッシュ関数は呪いになる可能性があります。たとえば、ハッシュ関数の非常に一般的な使用法はパスワードの保存です。基本的に、既知のランダム文字列と組み合わせたパスワードのハッシュを計算し(レインボー攻撃を妨げるため)、そのハッシュをデータベースに保存します。

問題は、攻撃者がデータベースのダンプを取得した場合、ブルートフォースを使用して非常に効果的にパスワードを推測できることです。彼が試みるすべての組み合わせはほんの数ミリ秒かかり、彼は毎秒数十万のパスワードを試すことができます。

この問題を回避するには、 bcrypt アルゴリズムを使用できます。 bcryptを使用してシステムを攻撃する場合、攻撃者の速度が大幅に低下します。最近 scrypt がいくつかの見出しを作成し、検討されていますbcryptよりも効果的であると言う人もいますが、.Net実装については知りません。

更新:

時代は変わりました。SHA3の勝者がいます。 keccak (別名 SHA3 )SHA3コンテストの優勝者。

元の回答:

最弱から最強の順に:

  1. RIPEMD BROKEN、使用すべきではないこのpdfに見られるように
  2. MD-5が壊れています。絶対に使用しないでください。ラップトップでは2分で壊れる可能性があります
  3. SHA-1が壊れています。絶対に使用しないでください。が壊れています原則として、攻撃は週ごとに改善されています
  4. SHA-2 WEAK、おそらく今後数年で壊れるでしょう。 いくつかの弱点が見つかりました。一般に、キーサイズが大きいほど、ハードが難しくなります。ハッシュ関数は破ることです。キーサイズ=強度は常に正しいとは限りませんが、ほとんどの場合正しいです。したがって、SHA-256はおそらくSHA-512よりも弱いでしょう。
  5. Skein NO KNWN WEAKNESSES、 SHA-3の候補。かなり新しく、テストされていません。 多数の言語で実装されています。
  6. MD6既知の弱点は、SHA-3のもう1つの候補です。おそらくSkienよりも強力ですが、シングルコアマシンでは低速です。シェーエンのようにテストされていません。 ミッションクリティカルな役割で、セキュリティを重視する開発者が使用しています。

個人的にはMD6を使用します。偏執心に陥ることはないからです。速度が本当に心配な場合は、SkeinまたはSHA-256を検討します。

MD5の防御では、任意のMD5ハッシュを持つファイルを生成する既知の方法はありません。原作者は、作業衝突を事前に計画する必要があります。したがって、受信者が送信者を信頼している場合、MD5は問題ありません。署名者が悪意のある場合、MD5は破損しますが、中間者攻撃に対して脆弱であるとは知られていません。

どちらを使用するかは、使用目的によって異なります。転送中にファイルが破損せず、セキュリティをそれほど気にしないことを確認したい場合は、高速で小さくしてください。数十億ドルの連邦救済協定にデジタル署名が必要であり、それらが偽造されていないことを確認する必要がある場合は、なりすましが遅くなります。

(md5がバラバラになる前に)私は、多くの暗号化のための圧倒的な破損にもかかわらず、md5を広く使用していることを知りたいです。

衝突に対する保護を気にしない限り(hmacでもmd5を使用しても安全です)、速度が必要な場合(より遅いハッシュが必要な場合)は、md5を自信を持って使用できます。

BLAKE2 アルゴリズムをご覧になるとよいでしょう。

説明したように、MD5よりも高速で、少なくともSHA-3と同じくらい安全です。また、 WinRarを含むいくつかのソフトウェアアプリケーションによって実装されています。

私はこの種のことの専門家ではありませんが、セキュリティコミュニティについていくと、多くの人々がmd5ハッシュが壊れていると考えています。どちらを使用するかは、データの機密性と特定のアプリケーションによって異なります。キーが適切で強力である限り、わずかに安全性の低いハッシュで逃げることができるかもしれません。

あなたへの私の提案は次のとおりです。

  1. 攻撃を予測する場合は、おそらくMD5を忘れてください。オンライン用に多くのレインボーテーブルがあり、RIAAのような企業は、同等のハッシュを持つシーケンスを生成します。
  2. 可能であれば、を使用します。メッセージにメッセージの長さを含めると、便利なハッシュ衝突を作成するのが非常に難しくなります。
  3. 一般的な経験則として、ビット数が多いほど衝突が少なく(ピジョンホールの原理による)、速度が遅くなり、安全性が向上します(脆弱性を発見できる数学の天才でない限り)。

デスクトップIntel P4コンピューターで31秒でmd5衝突を作成するアルゴリズムの詳細については、こちらをご覧ください。

http://eprint.iacr.org/2006/105

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top