(1)将来の破損をチェックし、(2)重複ファイル(名前やその他のメタデータが完全に異なる可能性がある)を排除するために、内部にバイナリデータを含む多数のファイルをハッシュしようとしています。
私はmd5とsha1およびそれらの親戚について知っていますが、これらはセキュリティのために設計されているため、ブルートフォース攻撃の効果を減らすために意図的に遅くなっていると理解しています。対照的に、衝突を可能な限り減らしながら、可能な限り高速に実行されるアルゴリズムが必要です。
助言がありますか?
(1)将来の破損をチェックし、(2)重複ファイル(名前やその他のメタデータが完全に異なる可能性がある)を排除するために、内部にバイナリデータを含む多数のファイルをハッシュしようとしています。
私はmd5とsha1およびそれらの親戚について知っていますが、これらはセキュリティのために設計されているため、ブルートフォース攻撃の効果を減らすために意図的に遅くなっていると理解しています。対照的に、衝突を可能な限り減らしながら、可能な限り高速に実行されるアルゴリズムが必要です。
助言がありますか?
あなたは最も正しいです。システムに敵がいない場合、暗号化ハッシュ関数を使用することは、セキュリティ特性を考えるとやり過ぎです。
衝突は、ハッシュ関数のビット数bと、計算するために推定するハッシュ値Nの数に依存します。学術文献は、この衝突確率はハードウェアエラー確率以下でなければならないと主張しているため、データをバイトごとに比較するよりもハッシュ関数と衝突する可能性は低くなります[ ref1、ref2、ref3、ref4、ref5 ]。ハードウェアエラーの確率は2^-12から2^-15の範囲です[ ref6 ]。N = 2^qを生成する予定の場合ハッシュ値の場合、衝突確率は次の方程式で与えられます。これは、誕生日のパラドックスをすでに考慮しています。
ハッシュ関数のビット数は、計算の複雑さに正比例します。 したがって、衝突確率を許容値に維持しながら、可能な限り最小のビットでハッシュ関数を見つけることに関心があります。
その分析を行う方法の例を次に示します。
各ファイルはc =lf / lc = 2^10チャンクに分割されます;
次に、 q = f * c = 2^25オブジェクトをハッシュします。
その方程式から、いくつかのハッシュサイズの衝突確率は次のようになります。
ここで、使用する64ビットまたは128ビットの非暗号化ハッシュ関数を決定する必要があります。64ビットはハードウェアエラーの確率にかなり近く(ただし高速になります)、128ビットははるかに安全なオプションです(低速ですが)。
以下に、非暗号化ハッシュ関数のウィキペディアから削除された小さなリストを見つけることができます。私はMurmurhash3を知っており、どの暗号化ハッシュ関数よりもはるかに高速です。
MD5とSHA1はセキュリティを目的として設計されていないため、特に安全ではなく、したがって、それほど低速でもありません。私は(Pythonを使用して)重複排除にMD5を使用しましたが、パフォーマンスは問題ありませんでした。
この記事では、今日のマシンは1秒あたり330MBのデータのMD5ハッシュを計算できると主張しています。
SHA-1は、MD5と同じ値にハッシュされる入力を作成できることが発見されたときに、MD5のより安全な代替手段として開発されましたが、MD5は問題なく機能すると思います。それは確かに私のためになりました。
セキュリティが問題にならない場合は、安全なハッシュ関数の1つを使用して、ラウンド数を減らすことができます。これにより、暗号的に不健全になりますが、それでも同等性テストには最適です。
かせはとても強いです。80ラウンドあります。10程度に減らしてみてください。
または、AESとXORを使用して出力ブロックを一緒に暗号化します。AESは、最新のCPUでハードウェアアクセラレーションが行われ、めちゃくちゃ高速です。