2016-07-20 4 views
3

以前はSHA1 + MD5の結合について尋ねましたが、その後は計算上のSHA1を理解してから、lagrgeファイルのMD5がSHA256よりも高速ではありません。 私の場合、4.6 GBのファイルは、Linuxシステムで(C#MONO)を持つデフォルトの実装SHA256で約10分かかります。ファイルを取得するSHA256ハッシュコードとチェックサム

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); 
    } 
} 

しかし、それは、そのような愛情を持っており、約9分かかりません。

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); 
    } 
} 

は、それから私は、彼らが言ったことに従って、私のコードを変更何とかthis topicを読んで。

次に、同じファイルのためにLinuxでsha256sumコマンドでファイルをテストしようとしています。これは約28秒かかり、上記のコードとLinuxコマンドの両方で同じ結果が得られます!

誰かがハッシュコードとチェックサムとの違いについて読むために私に助言し、私は違いを説明this topicに達します。

私の質問は以下のとおりです。

  1. 時間内に上記のコードとLinux sha256sumの間で、異なるの原因は何?

  2. 上記のコードは何をしますか? (つまり、ハッシュコード計算やチェックサム計算を意味するのでしょうか?C#でファイルのハッシュコードとファイルのチェックサムを検索すると、両方とも上記のコードに達します)。

  3. ありますかSHA256の衝突耐性がある場合でも、sha256sumに対する動機付けされた攻撃?

  4. にはどうすればC#でsha256sumとしての私の実装は早くすることができますか?

+0

あなたのコードから 'プロセス'を使って 'sha256sum'を呼び出せない理由はありますか? –

+0

@NateDiamondうん!まず、このプログラムはWindowsとLinuxで動作していなければなりません。 2番目は私の質問で言及したように、私はチェックサムの安全性が十分であるかどうか(またはハッシュコード)ではありません –

+0

これは、ディスクからファイルを読み込むコストによって完全に抑制されるはずです。 9分は考えられないことではありませんが、あなたは安っぽいスピンドルドライブと十分なRAMがない安いラップトップが必要です。使用するものを文書化する。 –

答えて

4
  1. ベストの推測では、File.Read操作のモノの実装におけるいくつかの追加のバッファリングがあるということです。最近、大きなファイルのチェックサムを調べると、まともな仕様のWindowsマシンでは、すべてがスムーズに動作していれば、1Gbあたり約6秒かかると思われます。奇妙なことに、複数のベンチマークテストで、SHA-512がSHA-256(以下の3を参照)よりも著しく速いことが報告されています。もう1つの可能性は、問題はデータを割り当てることではなく、一度読み込んだバイトを廃棄することである。 1つの大きな塊でストリームを読み込むのではなく、1つの配列でTransformBlock(とTransformFinalBlock)を使うことができるかもしれません。これがうまくいくかどうかはわかりませんが、調査があります。

  2. ハッシュコードとチェックサムとの差は(ほとんど)のセマンティクスです。彼らはどちらも入力のデータにかなりユニークな短い「マジック」ナンバーを計算しますが、4.6GBの入力を持ち、64Bの出力が「かなり」のものはいくぶん限定されています。チェックサムは安全ではなく、少しの作業で十分な出力からの入力を把握し、出力から入力に至るまで、そしてあらゆる種類の安全でないものを処理することができます。暗号化ハッシュは計算に時間がかかりますが、入力の1ビットを変更するだけで出力が大幅に変更されます。たとえば、SHA-512などの場合、出力から入力に戻る既知の方法はありません。

  3. MD5は壊れやすいので、必要に応じてPC上で任意の出力を生成するために入力を作成できます。SHA256は(おそらく)まだ安全ですが、数年後にはありません。あなたのプロジェクトの寿命が数十年であれば、それを変更する必要があると仮定します。 SHA512には既知の攻撃はなく、おそらくそれほど長くはないでしょうし、SHA256よりも速いので、とにかくそれをお勧めします。ベンチマークでは、SHA512の計算にはMD5よりも約3倍の時間がかかることが示されています。

  4. 上記以外にも、あなたは正しいことをしています。

光読書のビットのために

https://crypto.stackexchange.com/questions/26336/sha512-faster-than-sha256

チェックサムの目的は、ファイルが時間の間で変更されたかどうかをチェックできるようにすることですコメントで

を質問に対して編集あなたは元々それを書いていました、そしてあなたがそれを使用する時です。これはSHA512の場合512ビットという小さな値を生成することで行います。SHA512では、元のファイルのすべてのビットが出力値に少なくとも何らかの寄与をします。ハッシュコードの目的は同じですが、ファイルを慎重に変更することで他の誰も同じ出力値を得ることは本当に難しいです。前提は、チェックサムが最初と同じで、チェックするとファイルが同じで、チェックサムが異なる場合はファイルが確実に変更されているということです。あなたが上でやっていることは、小さな値を生み出すために読み込んだビットを転がしたり、折り重ねたり、紡ぎ出すような威力によって、ファイル全体を供給していることです。

例として、現在私が書いているのは、ファイルのサイズが変更されているかどうかを知る必要があるため、ファイルを16Kブロックに分割し、各ブロックのSHA-512ハッシュを取り、それを別のドライブの別のデータベースに保管してください。ファイルが変更されたかどうかを確認するために、各ブロックのハッシュを再現し、元のものと比較します。私はSHA-512を使用しているので、ファイルが変更される可能性はありますが、ハッシュ値は同じではありませんので、100GBのデータの変更を検出して、データベースに数MBのハッシュしか保存しないと確信できます。私は、ハッシュを取ると同時にファイルをコピーしています。プロセスは完全にディスクにバインドされています。ファイルをUSBドライブに転送するのに約5分かかり、そのうちの10秒はおそらくハッシュに関連しています。

ハッシュを格納するためのディスク領域の不足は私がポストで解決できない問題です... usbスティックを購入しますか?

+0

まあ、sha256がsha512よりも遅いのは驚くべきことです!私は別の質問があります。上記のコードは何ですか?それはうんざりかもしれませんが、私は 'ファイルチェックサムを取得する'と 'ファイルハッシュを取得'を検索すると、何か違うものを見つけることができません。彼らはどちらも同じ結果を出します。人々は正確に何をしているのか分からないようです。 (私のように!) –

+0

もう1つはsha512の128バイトを保存できません!そこにはたくさんのファイルがあり、私は十分な音量がありません。 –

+0

回答を編集しました –

関連する問題