10

たとえば、サイズが数十ギガバイトの大きなファイルのハッシュのパフォーマンスを向上させたいと考えています。

通常、ハッシュ関数を使用してファイルのバイトを順次ハッシュします (たとえば、SHA-256 などです。ただし、Skein を使用する可能性が最も高いため、[高速] SSD)。これを方法 1 としましょう。

アイデアは、ファイルの複数の 1 MB ブロックを 8 つの CPU で並列にハッシュし、連結されたハッシュを単一の最終ハッシュにハッシュすることです。これを方法 2 としましょう。

この方法を示す図は次のとおりです。


ここに画像の説明を入力


このアイデアが正しいかどうか、およびファイル全体のスパンで単一のハッシュを実行する場合と比較して、(衝突の可能性が高いという点で) どの程度の「セキュリティ」が失われるかを知りたいです。

例えば:

SHA-2 の SHA-256 バリアントを使用して、ファイル サイズを 2^34=34,359,738,368 バイトに設定します。したがって、単純なシングル パス (方法 1) を使用すると、ファイル全体の 256 ビット ハッシュを取得できます。

これを次のものと比較してください。

並列ハッシュ (つまり、方法 2) を使用して、ファイルを 1 MB の 32,768 ブロックに分割し、SHA-256 を使用してこれらのブロックを 256 ビット (32 バイト) の 32,768 ハッシュにハッシュし、ハッシュを連結して、結果として連結された 1,048,576 バイトのデータ セットが、ファイル全体の最終的な 256 ビット ハッシュを取得します。

方法 2 は方法 1 よりも安全性が低くなりますか? おそらく、この質問を次のように言い換える必要があります: 方法 2 を使用すると、攻撃者が元のファイルと同じハッシュ値にハッシュするファイルを作成しやすくなりますか?ハッシュは N 個の CPU で並列に計算できますか?

更新: 方法 2 の構成がハッシュ リストの概念に非常に似ていることを発見しました。ただし、前の文のリンクで参照されているウィキペディアの記事では、ファイルの単純な古いハッシュである方法 1 と比較した場合の衝突の可能性に関して、ハッシュリストの優劣について詳しく説明していません。のハッシュ リストが使用されます。

4

3 に答える 3

9

ブロックベースのハッシュ (方法 2) は、実際に使用されるよく知られた手法です。

あなたがしていることと同じように、これらのメソッドはブロック ハッシュとハッシュのリストを取り、それを 1 つの短いハッシュに落とし込みます。これは十分に確立された慣行であるため、シーケンシャル ハッシュと同じくらい安全だと思います。

于 2011-08-10T18:09:42.863 に答える
5

最新のハッシュ設計の中には、それらを並行して実行できるものがあります。かせハッシュ関数の効率的な並列アルゴリズムを参照してください。新しい(したがって、十分にテストされていない)ハッシュアルゴリズムを使用する場合は、マルチプロセッサマシンで必要な速度の向上が得られる可能性があります。

Skeinは、NIST SHA-3競争の最終段階に達したため、完全にテストされていないわけではありません。

于 2011-08-10T19:27:54.797 に答える
0

ハッシュを生成するのに必要な時間は、ハッシュするデータのサイズの関数であるため、攻撃者が衝突を見つけるのは非常に簡単だと思います。暗号的に安全なハッシュの優れた点の 1 つは、攻撃者が 100Gb ファイルを取得し、変更したい場所を見つけ、そのブロックの前後のすべてをハッシュし、それらの事前計算された値を使用してハッシュをすばやく取得できないことです。関心のあるビットへの小さな/迅速な順列の後のファイル全体の。これは、ハッシュアルゴリズムに重複するスライディングウィンドウがあるためです。

つまり、ファイルの途中を編集した場合でも、最終的なチェックサムを取得するには、ファイル全体をハッシュする必要があります。したがって、100Gb ファイルは、100 バイト ファイルよりも衝突を見つけるのに時間がかかります。例外は、編集がファイルの最後で意味をなさない場合です。これが、大きなファイルの衝突の例で「野生」で頻繁に見られる理由です。

ただし、元のファイルをブロックに分割すると、攻撃の速度は最小のブロック (または変更するブロックのサイズ) の関数になります。ファイル サイズはハッシュ時間に比例して増加するため、100Gb のファイルは順列/MD5 ごとに約 2000 秒かかりますが、1Mb のブロックでは、攻撃者は1 秒あたり50 回試行できます。

解決策は、ファイルを重複するチャンクに分割し、それらのチャンクを個別に MD5 することです。結果のハッシュは、開始から終了の順序と終了から開始の両方でハッシュを連結したものになります。衝突を見つけるには、並列化された方法ではありますが、ファイル全体をハッシュする必要があります。

于 2016-03-24T13:39:28.610 に答える