web-dev-qa-db-ja.com

どの暗号化ハッシュ関数を選択する必要がありますか?

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

  • MD5:16バイト(ハッシュする時間500MB:1462ミリ秒)
  • SHA-1:20バイト(1644ミリ秒)
  • SHA256:32バイト(5618ミリ秒)
  • SHA3​​84: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();
    }
133
Sam Saffron

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

  1. 衝突抵抗:同じものをハッシュする2つのメッセージ(any2つのメッセージ)を見つけるのは困難です。
  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関数を使用することをお勧めします。使用している実装では、かなり遅いようです。

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

135
Eric Burnett

すべてのハッシュ関数は「壊れている」

ピジョンホールの原理 は、2つの穴に2つ以上のハトを入れることはできない(ハトを切り抜かない限り)できる限り努力することを意味します。同様に、2 ^ 128 + 1個の数字を2 ^ 128スロットに収めることはできません。すべてのハッシュ関数は有限サイズのハッシュになります。つまり、「有限サイズ」+ 1シーケンスを検索すると、常に衝突を見つけることができます。そうすることは不可能です。 MD5用ではなく、 Skein 用でもありません。

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コリジョンが野生に出るまで長すぎることはありません。

さまざまなハッシュ関数に関する最新情報については、 ハッシュ関数Zoo を参照してください。

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

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

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

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

108
Sam Saffron

更新:

時代は変わりました。SHA3の勝者がいます。 keccak (別名 SHA )SHA3コンテストの勝者を使用することをお勧めします。

元の回答:

最も弱いものから最も強いものの順に:

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

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

35
Ethan Heilman

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

3
rlbond

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

2
tvanfosson

多くの暗号化のための圧倒的な破損にもかかわらず、私はまだmd5を広く使用していることを(md5がバラバラになる前に)チャイムに入れたいと思います。

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

2
Mike Boers

BLAKE2 アルゴリズムを見てみるのは良いアイデアです。

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

1
Florin Mircea

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

0
blueintegral

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

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

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

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

0
Unknown