web-dev-qa-db-ja.com

ハッシュ関数での丸め

まずは、こんにちは!このサイトは初めてですが、「よろしく」に相当する英語を知りません。

だから、私は SHA-512cryptジェネレータのドキュメント を読んでいて、次の部分を見つけました:

両方のアルゴリズムのデフォルトのラウンド数は5,000です。一方、最小限のセキュリティと安定性を確保するには、Nの最小値と最大値を適用します。

n = 1,000の最小値

nの最大値= 999,999,999

私の謙虚な心の中で、ハッシュ関数の多くのラウンドに適用すると、衝突によってハッシュの2乗の1つに戻る可能性があるため、非常に興味深いです。

私は正しいですか?または衝突の私の理解は間違っていますか?

私が見ているように、あなたは両方とも、長すぎるプレーンテキストまたは同じハッシュ関数のあまりにも多くのアプリケーションとの衝突を引き起こす可能性があります。

文法の誤りでごめんなさい、私は英語を母国語とする人ではありません。

1
WOkzinhan

この文脈ではyoroshikSecurity.StackExchangeでの長く生産的な存在の希望 :-)としてレンダリングできると思います。ようこそ、ようこそ!

あなたは部分的に衝突問題の理解において正しいです。リスクは存在しますが、アルゴリズムの出力が「フラット」である場合、リスクはラウンド数に関係なく基本的に同じです。

ラウンド数を増やすことによって強化される「セキュリティ」は、大量のハッシュを生成しようとする誰もが(たとえば、ブルートフォース攻撃のために)、適切とは考えられない量の計算能力を必要とするという保証です。

10,000ラウンドのSHA-512のコストは、1,000ラウンドのSHA-512の10倍であるとしましょう。次に、どのような目的で10Kのラウンドハッシュを列挙しても、1Kのラウンドハッシュよりも10倍時間がかかります。

通常、ほとんどのアプリケーションでは、「ハッピーデイシナリオ」には、ハッシュ関数へのone呼び出しのみが含まれます(たとえば、ユーザーが入力したパスワードをハッシュしています)。したがって、高いラウンド数を使用しても、ユーザーが無視できるほどの遅延を経験することができます。

私が見る方法では、両方とも、長すぎるプレーンテキストまたは同じハッシュ関数の適用が多すぎると衝突を引き起こす可能性があります

はい。ただし、呼び出しは同じラウンド数でのみ比較しています。たとえば、「foo」の10Kラウンドのハッシュはabcdefであり、「bar」の1Kラウンドのハッシュはあまりにもabcdefだとしましょう。これは一種の衝突です。

ただし、システムが実行されると、すべてのラウンドでハッシュ結果が使用されるわけではありません。ハッシュを返す前に、10K番目のラウンドが完了するまで待機します。 決して知らない「衝突」がラウンド1,000で生成されたことを示します。

4
LSerni

ハッシュアルゴリズムの理解を少しリフレッシュしましょう。

ハッシュ関数は、暗号的に安全である場合とそうでない場合があります。非セキュアなハッシュ関数は、文字列マッピング、通信プロトコルでのエラー検出などのタスクに役立ちます。ただし、これらには特定の弱点があるため、暗号化の目的には役立ちません。

安全のために、ハッシュ関数には次の3つの特定の属性が必要です。

  • カスケード変更:メッセージの1ビットの変更により、ダイジェストのビットの約50%の予測できない変更が発生するはずです。
  • 元に戻せません:ブルートフォース攻撃による場合を除いて、ハッシュを指定してメッセージを再作成することはできません。
  • 衝突抵抗:同じハッシュ値を持つ2つのメッセージを見つけることは不可能です。

本質的に、カスケード効果は他の2つの属性の背後にある強さを提供するため、最も重要な属性です。

これらの各属性は、特定のタイプの攻撃から保護します。ハッシュラウンドを実行することにより、暗号化アルゴリズムはメッセージに少なくとも1ビットの変更を加え、完全に新しいハッシュを生成します。ハッシュアルゴリズムに強い衝突耐性がない場合は、はい、ハッシュをあまり変更しない複数のラウンドが可能です。

CRC-32などの非暗号化ハッシュルーチンでは、衝突耐性がないことが問題になっています。この場合、同じメッセージが少しだけ変更された場合、同じダイジェスト値が生成される可能性があります。したがって、ソースが数バイトだけ変化するデータをポンプで送り出している場合、説明した円の中に残ったままに衝突する可能性があります。そのため、これらの属性はセキュリティの目的で非常に重要です。

0
John Deters

ハッシュ関数は、短いサイクルまたは固定小数点を持つ場合があります。固定小数点は、hash(value) == valueの値です。固定小数点に達した後に行われる反復は何も変更しないため、これにより反復ハッシュのセキュリティが大幅に低下します。

これを解決するために、ハッシュは反復カウントをハッシュの一部として使用することもできます。

hash = hmac(password, salt)
for (i = 0; i < iter_count; i++) {
    hash = hmac(password, hash + i)
}
return hash

PBKDF2が使用する別のソリューションは、XORすべての中間ハッシュを結果で一緒にすることです。

ハッシュサイクルと固定小数点は、理論上のリスクです。ヒットする可能性は非常に低く、SHA1などのハッシュ関数の既知のサイクルは知られていません。

0
Sjoerd