web-dev-qa-db-ja.com

データ自体を保存せずに、プライベートデータの重複チェックのための汎用低速/一意ハッシュルーチン?

MD5、SHA1などのさまざまなハッシュルーチンを繰り返すたびに失われることが知られている一意性のパーセンテージがあるのか​​、それが他のアルゴリズムとどのように比較されるのかと思います。

理論的には、256^16*99%異なる値で、それぞれに一意のMD5同等物があります。100回ハッシュすると、.99^100=36.6%ネームスペース。名前空間の広さを考えると、どれが悪いことではありませんが、実際のパーセンテージは何ですか?もっと90%またはそれ以上?遅い汎用ハッシュの代替推奨事項はありますか?

私はブルートフォースが高価であり、理想的ではないエントロピーを持つ値が存在する可能性があることを確認したいのですが、物事を遅くする必要があります。明白な解決策は、プロセスを不合理な回数繰り返すことです。

SHA-1またはXORの組み合わせも検討していますが、これについてのあなたの考えを聞きたいです。

17
Bryan Field

スペースの削減は発生しますが、そうではありません。

安全なハッシュ関数は、ランダム関数が平均して行うように動作するはずです(つまり、入力と出力の長さが同じである可能な関数のセットから均一に選択された関数)。 MD5とSHA-1は最終的に安全ではないことが知られています(ランダム関数を使用した場合よりも効率的に衝突を見つけることができるため)。ただし、ここではまだ十分に近似しています(ただし、相互運用性を除いて、これらを使用しないでください)。レガシー実装では、SHA-256のようなよりモダンで安全な機能を使用する必要があります)。

したがって、 n -bit出力と仮定すると、2つすべてをハッシュすると n n ビットの文字列の場合、すべての出力が 2のスペースの約63.21%をカバーすることが期待できます。可能な出力値(それは1 1/ e )です)。スペースの3分の1以上を失う。 ただし、これらの取得された値をすべて再度ハッシュすると、失われる値は3分の1未満になります。削減係数は各ラウンドで一定ではありません。数回のラウンドの後、1ラウンドあたりの追加の削減はごくわずかです。

与えられた値を many 回続けてハッシュすると、下の図のように、実際には「ロー構造」を歩いていることになります。

Rho structure when walking in a random function graph

この構造は、ギリシャ文字のρ、「rho」にほぼ似ているため、このように呼ばれています。各ドットは n -bit値であり、各矢印はハッシュ関数の適用を表します。青い点が出発点です。つまり、関数を何度も十分に適用することで、最終的にはサイクルになるという考え方です。サイクルに入ると、ハッシュ関数を連続して適用しても、可能な値のスペースが減ることはありません。サイクルを無制限に歩くだけです。サイクルの長さは、これまでに達成できる最小のスペースサイズです。

「テール」(サイクルに入る前に通過する値)と「サイクル」自体の長さは、平均して2です。 n / 2。したがって、128ビット出力のハッシュ関数の場合、連続するアプリケーションはスペースを2未満に削減しません64、非常に大きな値。最小限のスペースに到達する場合でも、平均して264 高価なハッシュ関数の評価。


Rho構造を歩いてサイクルを見つけることは、実際には---(Floydのサイクル探索アルゴリズム の基礎です。これは、ハッシュ関数の衝突を構築するために使用できる一般的なアルゴリズムの1つです:rho構造で、尾がサイクルに接続されているポイントで、衝突(同じ値にハッシュされる2つの異なる値)があります。暗号的に安全なハッシュ関数の場合、衝突を見つけるのは難しいと思われます。特に、フロイドのアルゴリズムは計算上実行不可能である必要があります。これは、 n を十分に大きくすることで達成できます(たとえば、 n = 256 SHA-256の場合) :これにより、フロイドのアルゴリズムのコストが2に上昇します。128、つまり、地球上で現実的に実現可能ではありません)。

言い換えると、if十分に広い出力(安全であるための前提条件)を備えた安全なハッシュ関数を選択しますthenサイクルに到達できず、 /またはそれを歩くと、セキュリティが「スペース削減」の影響を受けることはありません。 Corollary:スペース削減の問題がある場合、安全なハッシュ関数を使用しておらず、 that は修正する必要のある問題です。したがって、SHA-256を使用します。

25
Tom Leek