2016-07-19 2 views
4

安全な方法でファイルのチェックサムを作成しようとしています(10GB以上!)。SHA1 + MD5の組み合わせを使用

SHA256は十分安全ですが、このアルゴリズムはプロセスが高価であり、適切ではありません。 まあ私はSHA1とMD5チェックサムの両方が衝突によって安全でないことを知っています。

だから私は、SHA1 + MD5のようにMD5とMD5を組み合わせていると思います。同じMD5とSHA1の両方でファイル(Collision)を同時に取得する方法はないと思います。

SHA1 + MD5をファイルチェックサムに十分に安全に結合していますか?それとも衝突のような攻撃がありますか?

Iアップデート1双方向(BufferstreamとBufferedstreamせず)

public static string GetChecksum(string file) 
    { 
     using (FileStream stream = File.OpenRead(file)) 
     { 
      var sha = new SHA256Managed(); 
      byte[] checksum = sha.ComputeHash(stream); 
      return BitConverter.ToString(checksum).Replace("-", String.Empty); 
     } 
    } 

    public static string GetChecksumBuffered(Stream stream) 
    { 
     using (var bufferedStream = new BufferedStream(stream, 1024 * 32)) 
     { 
      var sha = new SHA256Managed(); 
      byte[] checksum = sha.ComputeHash(bufferedStream); 
      return BitConverter.ToString(checksum).Replace("-", String.Empty); 
     } 
    } 

のC#のモノを使用する: IはSHA1ハッシュ+ MD5ハッシュを意味します。最初にファイルのSHA1を計算し、次にファイルのMD5を計算し、次にこの2つのスティングを一緒に追加します。

アップデート2:

zaph @私は私のコード(C#MONO)を実装述べたように、再び私はhereを読んでいますが、早く彼が言ったように私のコードを作成していないものをに従って!それは4.6 GBのファイルの速度を約12分から約8分にします。しかし、sha1 + md5はこのファイルのために100秒未満です。ですから、私はまだSHA256を代わりに使用するのは適切ではないと思います。

+0

@zaphよく使用しています!私はあなたがLinuxのミントでMono(C#)のデフォルトの実装で言ったことをテストする - 4 GBのファイルの場合は約12分かかります - 108 MBのファイルの場合は19秒かかる....だから何が問題なのですか?私はコアを使用しています7インテルCPU –

+0

あなたの実装は遅くなければなりません。私のCPUは2010 2.8GHzのクアッドコアインテルXeonです。私の2011ラップトップは高速です。ほとんどのIntelプロセッサには暗号操作を高速化するための命令があります。 – zaph

+0

これはリアルタイムで実行していますか? –

答えて

1

SHA-256およびMD5 + SHA1の組み合わせとの間のわずかな差がなければなりません。

知るための唯一の方法のベンチマークにある:

私の机の上に:これらの時間は、ハッシュにのみある
SHA-256: 200 MB/s
MD5: 470 MB/s
SHA1: 500 MB/s (updated, previously incorrect)
MD5+SHA1 240 MB/s

、ディスクは、時間を読んで含まれていない。テストは1MBバッファで行い、10回以上の平均をとった。言語は "C"で、ライブラリはAppleのCommon Cryptoでした。 CPUは2.8 GHzのクアッドコアインテルXeon(2010年のMacPro、私のラップトップは高速)でした。

最終的に、MD5 + SHA1を組み合わせて使用​​すると23%高速です。

メモ:ほとんどのIntelプロセッサには、暗号操作を高速化するための命令があります。すべての実装がこれらの命令を利用するわけではありません。

sha256sumなどのネイティブ実装を試してみてください。

+0

私はBufferedStreamでC#で何度もテストしますが、私の4GBファイルでは少し違いがあります。今8分後に終了しました。私はあなたが間違っていると思うbcuz私は思う(分からない)sha256はsha1よりも遅くなければならないが、あなたの例ではsha256が速い!あなたは190 MB/sを与えるどの言語と実装を共有していますか? –

+0

ソースコードを追加しました。 –

1

SHA1 + MD5でSHA-1と最初にハッシュし、そのダイジェストをMD5に入力すると、衝突が完全に排除されず、1つの発生の可能性が減少する可能性があります。

SHA-1とMD5の両方が固定長の暗号化ハッシュ関数であり、メッセージ長がダイジェストサイズより大きい場合、衝突が発生するようにバインドされています。 160ビットのSHA-1ダイジェストをMD5 への入力として使用する場合は、あなたがSHA-1

  • を使用して、任意の長さのメッセージをハッシュする場合

  • +0

    OMG!いいえ、sha1ハッシュ+ md5ハッシュを意味します。最初にファイルのsha1を計算し、ファイルのmd5を計算してから、この2つのスティングを一緒に追加します。 –

    +0

    2つのダイジェストを単純に連結すると、全体的な衝突抵抗は暗号的に強いハッシュ関数、この場合はSHA-1のものになります。 – Mingky

    +1

    @Mingky(私が言う限り)これは真実ではありません。なぜなら、両方のハッシュの衝突をもたらすソースを見つける必要があるからです。 MD5に追加されたCRCさえ、衝突を見つけることをより困難にするでしょう。 – wischi