web-dev-qa-db-ja.com

ハッシュハッシュハッシュは衝突するべきですか?

キーストレッチは基本的にハッシュハッシュを何度も繰り返すことになります(ソルト、ペッパー、パスワードがハッシュ関数を個別化しますが、原則は同じです)ので、この質問について疑問に思います。

一方では、ハッシュは可能な限り衝突がないようにする必要があります。ハッシュ自体の場合、長さが同じであるため理論的には達成可能ですが、これにより全単射マップが存在します。つまり、ハッシュh1ごとに別のハッシュh2を指定でき、そのハッシュは元のハッシュh4になります。ハッシュを反転できます。次に、「単純に」反転を使用してハッシュチェーン全体を反転し、有効なパスワードを作成できます。さらに悪いことに、ソルト/ペッパーとパスワードが同じように鍵の導出に影響を与える場合、作成されてからソルティングが役に立たなくなる可能性があります。パスワードはその影響を補う可能性があります。

一方、ハッシュハッシュが衝突する場合、これは一部のハッシュが他のハッシュより安全であることを意味します。一部のハッシュは別のハッシュをハッシュしても取得できませんが、他のハッシュは複数のハッシュから取得できます。そして、これらのハッシュはアトラクタであり、取得できないハッシュよりも多くのハッシュラウンドの後に発生する可能性がはるかに高く、潜在的なキースペースを効果的に削減します。

では、これら2つの可能性のどちらが悪いのか、そしてどちらが実際のケースなのか。パスワードとソルト/ペッパーの選択はハッシュ関数を変更するので、答えはそれに依存しますか?この問題は、最後のハッシュだけでなく、ハッシュのチェーン全体を連結することで解決できますか? (まだ名前がない場合は、ハッシュキャットを提案してもいいですか?)

1
Tobias Kienzler

ハッシュ関数は出力スペースよりもはるかに大きな入力スペースを持っているため、衝突は通常の機能であり、すべての可能な出力は多くの一致する入力に対応すると予想されます。

原則として、衝突はパスワードハッシュの問題ではありません。前の段落は、すべてのハッシュ出力(特にサーバーデータベースに保存されているもの)に対して、すべて同等の多くの一致するパスワードがあることを意味します。しかしながら:

  • 保存された出力に一致する単一のパスワードを見つけるには、ハッシュ関数のpreimageresistanceを破る必要があります。
  • 既知のパスワードと同じハッシュを生成するsecondパスワードを見つけるには、ハッシュ関数のsecondプリイメージ抵抗を破る必要があります。

nビットの出力を持つ「暗号的に安全な」ハッシュ関数は抵抗を提供するはずです2n両方の種類の攻撃に対して、ここでは実際の問題はありません。既知の衝突abstractoは、攻撃者にあまり力を与えません。攻撃者は特定のパスワードを使用でき、同じ効果を持つ「スペア」を持っています。だから何 ?

関数を反復するときのスペースの削減については、 この前の回答 を参照してください。要約:スペースの削減は発生しますが、サイズ2の内部スペースより下ではありませんn/2、さらに:

  • 実際に到達するには多くの努力が必要です。
  • 効率的に特性化することはできません(特定の値がその内部空間の一部であるかどうかを簡単に知ることはできません)。

SHA-256を使用して、幸せになりましょう。

1
Thomas Pornin

ハッシュのいずれかのレベルが衝突すると、追加のすべてのレベルも衝突します。ただし、スペースが非常に大きいため、暗号化された安全なハッシュを使用しても問題が発生することはほとんどありません。

たとえば、ABCをハッシュして123を取得し、次に123をハッシュして456を取得した場合。DEFをハッシュして123を取得した場合、2回目のハッシュは最初の例と同じものをハッシュします。キースペースは非常に大きいので、実際的な問題ではありません。この問題は、最後の2回の反復の結果をハッシュすることによっても軽減できます(したがって、ABC123のハッシュはDEF123のハッシュとは異なる可能性があります)。

1
AJ Henderson