web-dev-qa-db-ja.com

SHA256 / 512ハッシュを生成する場合、ハッシュするデータの「安全な」最小量はありますか?

ハッシュを作成するときに、小さなファイルや大量のデータが使用されると、結果のハッシュが衝突する可能性が高くなる可能性があると聞いています。それが本当なら、これが起こらないようにするために使用されるべき最小の「安全な」データ量はありますか?

質問は次のように表現することもできると思います。

安全かつ確実にハッシュできるデータの最小量はどれくらいですか?

23
PeterM

ハッシュ関数は、任意の(または少なくとも非常に長い)長さの入力を受け入れ、固定長の出力を生成します。可能な出力よりも可能な入力の方が多いため、衝突が存在する必要があります。安全なハッシュ関数の要点は、「衝突耐性」があることです。つまり、衝突は数学的に存在する必要がありますが、実際に計算するのは非常に困難です。したがって、SHA-256とSHA-512の既知の衝突はなく、衝突を計算するための最もよく知られている方法(意図的にを実行する)は次のとおりです。非常にばかげて高価なので、すぐには適用されません(1世紀の米国連邦予算全体では、タスクの途方もなく小さな部分しか購入しません)。

したがって、意図的に現実的に実行できない場合、(不運な)運が原因で衝突が発生しないことが期待できます。

さらに、非常に短い入力に制限すると、衝突がまったく発生しない可能性があります。たとえば、12バイトの入力を検討する場合:2つあります96 12バイトの可能なシーケンス。それは巨大です(今日のテクノロジーで列挙できる以上のものです)。それでも、SHA-256は、各入力を256ビット値、つまり、はるかに広いスペース(サイズ2)の値にマップします。256)。正式に証明することはできませんが、2つすべてが96 ハッシュ値は互いに異なります。これには実際的な影響はないことに注意してください。衝突がないために衝突が見つからない場合と、衝突する可能性が非常に低いために衝突が見つからない場合との間に測定可能な違いはありません。

SHA-256との衝突のリスクがいかに低いかを説明するために、地元の動物園や個人所有者から逃げ出したゴリラに襲われるリスクを考えてみましょう。ありそうもない?はい、しかしそれはまだ起こるかもしれません:ゴリラが 2004年のダラス動物園 から逃げ出し、4人を負傷させたようです。別のゴリラが 2010年の同じ動物園 から脱出しました。地球全体(ダラス地域だけでなく)に6年ごとに暴れ回るゴリラが1頭だけいて、65億人の人口のうち、あなたがたまたま彼の道を進んでいる不運な男であると仮定すると、重大な危険があります-ゴリラによる身体的危害は約2分の1と推定できます43.7 1日あたり。ここで、10のPCを取得し、SHA-256の衝突の検出に取り組んでもらいます。衝突にぶつかる可能性は2分の1に近い75 1日あたり-怒っている猿のものよりも10億以上の可能性は低いです。結論として、SHA-256の衝突を恐れているが、ロードされたショットガンを常に携帯していない場合は、優先順位が間違っていることになります。また、テキサスを台無しにしないでください。

90
Thomas Pornin

いいえ、メッセージの長さは衝突の可能性に影響しません。

その場合、アルゴリズムは壊れています。

SHAをすべての1バイト入力に対して実行し、次にすべての2バイト入力に対して実行するなどして、自分で試すことができます。衝突が発生するかどうかを確認します。おそらく、誰も持っていないため、そうではありません。 SHA-256またはSHA-512の衝突を発見したことがあります(または少なくともそれらは ウィキペディアから秘密にしておいた

1
Thilo

ハッシュは256ビット長であり、256ビットより長いものには衝突があります。

衝突がなければ、何かを小さなものに圧縮することはできません。

はい、アルゴリズムと2の256の累乗のために、さまざまなハッシュがありますが、衝突がないわけではないため、不可能です。

0
Tore Ussing

最小入力サイズはありません。 SHA-256アルゴリズムは事実上ランダムマッピングであり、衝突確率は入力の長さに依存しません。 1ビット入力でも「安全」です。

入力は、SHA-256の場合は512ビット(64バイト)の倍数(SHA-512の場合は1024の倍数)にパディングされることに注意してください。 12バイトの入力(Thomasが彼の例で使用したように)を使用すると、SHA-256を使用する場合、長さ64バイトの2 ^ 96の可能なシーケンスがあります。

例として、12バイトの入力Hello There!(0x48656c6c6f20546865726521)には、1ビット、351のゼロビット、64ビットが埋め込まれます。 512ビットの埋め込みメッセージを形成するための0x0000000000000060であるビット単位の入力の長さの表現。この512ビットのメッセージは、ハッシュを計算するための入力として使用されます。

詳細については、RFC:4634「USSecure Hash Algorithms(SHA and HMAC-SHA)」、 http://www.ietf.org/rfc/rfc4634.txt を参照してください。

0
Babu Srinivasan