web-dev-qa-db-ja.com

プライベート文字列の一部をハッシュするのは安全ではありませんか

文字列[〜#〜] b [〜#〜]とハッシュhash(P+B)hash(P); [〜#〜] p [〜#〜]は、hash(P)を使用するよりも、この情報を使用して簡単に明らかにすることができますか?違いはなんですか ?
これをよりよく理解するのに役立つ記事やあらゆる種類の情報へのリンクは本当にありがたいです。

3
Behrooz

追加情報は攻撃者を助けるだけです。しかし、その余分な助けはごくわずかかもしれません。

ハッシュ関数を ランダムオラクル としてモデル化すると、h[〜#〜] p [〜#〜]+ [〜#〜] b [〜#〜])指定された空でない文字列に対して[〜#〜] b [〜#〜]しますnot攻撃者に役立つ追加情報を生成します(私は「+」をここでは、数値の加算ではなく、文字列の連結を意味します。「ランダムオラクル」は、(大まかに言えば)試行せずに、特定の入力の出力について何も知らないような関数です。hx)の場合、ブルートフォースによってのみxに関する情報を取得できます。つまり、一致するものが見つかるまでxの潜在的な値を試します。したがって、h[〜# 〜] p [〜#〜]+ [〜#〜] b [〜#〜])は、h[〜#]と比較して、攻撃者に追加の権限を与えません。 〜] p [〜#〜])、および[〜#〜] b [〜#〜]がどのように選択されたかに関係なく、攻撃者は潜在的な[〜#〜] p [〜 #〜]値と幸運を期待します。攻撃者が自分の側で物事を最適化するためにできる最善のことは、各tの計算コストを最小化する戦略を選択することです。 ry;一般的なハッシュ関数のコストは入力サイズに比例するため、攻撃者はhよりもh[〜#〜] p [〜#〜]))を使用することを好みます。 ([〜#〜] p [〜#〜]+ [〜#〜] b [〜#〜])とにかく。

ランダムオラクルモデルの問題点は、通常のハッシュ関数がランダムオラクルではない。ただし、 Merkle–Damgård ハッシュ関数(MD5などの一般的なハッシュ関数を含むカテゴリ)の場合です。 、SHA-1、SHA-256およびSHA-512)、「 長さ拡張攻撃 」というプロパティがあります:h[〜#〜] p [〜# 〜])、h[〜#〜] p [〜#〜]+ [〜#〜] b [〜#〜])を計算することができます[〜#〜] b [〜#〜]大部分は自由に選択できる値であり、[〜#〜] p [〜#〜]lengthof [〜#〜] p [〜#〜]を知る必要がありますが、実際の値は知りません)。長さ延長攻撃は通常、無害な好奇心として説明されます。または弱点(ほとんどのプロトコルでは無害で無視できます);しかし、私たちの場合、それは興味深い結果をもたらします。つまり、h[〜#〜 ] p [〜#〜]+ [〜#〜] b [〜#〜])は、攻撃者に追加情報を提供しません。攻撃者は私たちを待つ必要はありませんでした:彼はすでに計算h[〜#〜] p [〜#〜]+ [〜#〜] b [〜#〜 ][〜#〜] b [〜#〜]値の大きなクラスの場合。

3
Thomas Pornin

私はあなたの質問の構成に少し混乱していますが、それでもどのような場合でも主題にいくらかの光を当てることができるはずです。

まず、_P+B_と言うときは、何らかの形での追加ではなく、PBが連結されることを意味していると仮定します。事前に作成されており、以下では_||_ではなく_+_表記で示します。

第二に、暗号的に安全なハッシュ関数の出力は、その入力に関する情報を明らかにしません。もしそうなら、それは安全な機能とは見なされなくなります。したがって、H(P||B)を知っているだけで、実際には2つの未知の入力(PとB)のハッシュであり、H(P)もそれらの未知の1つのハッシュであることがわかりません。未知の入力が実際に何であるかに関する情報。

第三に、暗号的に安全なハッシュ関数は、効率的なテストのためにランダムと区別できない出力を生成します。これは、関連する入力(この場合、Pは入力の関連部分です)が関連する出力を生成しないことを意味します。実際にPBのハッシュであることを知らずにH(P||B)を指定すると、H(P)の出力とは無関係の出力が生成されます。 H(P)からPまたはBについて、またはH(P||B)からPについて何も学習しません。

では、何を攻撃できるのでしょうか?暗号化された安全なハッシュ関数の出力から入力について何も学習しないため、攻撃する方法は、候補入力をテストし、それらを指定されたハッシュ出力と比較して、通常はいずれかの辞書を使用して一致するかどうかを確認することです。またはブルートフォースで入力候補を生成します。これを考えると、入力が短くランダム性が低いほど、一致するものを見つけるためにテストする必要のある入力候補が少なくなります。したがって、攻撃者がとる明らかなアプローチは、ハッシュがH(P||B)H(P)の結果であり、どちらがどちらであるかはわかっているが、PまたはBは、H(P)の出力を攻撃します。入力が小さく、エントロピーのビットが必然的に少ないため(Bは、既存の理由で入力に少なくとも1ビットのエントロピーを追加する必要があります)、攻撃者はPを見つけることができます。 _P||B_よりも速く、それを使用してH(P||B)を攻撃し、Bを見つけようとします。

ただし、H(P)からPを見つけるのは必ずしも簡単であり、現実的にも可能であるとは限りません。理論的には簡単です。 may可能であり、簡単ですが、それはPのプロパティに完全に依存します。それが小さく、ランダムでない場合、小さい値とランダムでない値については、完全に実行可能です。それが大きくて非常にランダムである場合、必要な候補テストの数により、正しい入力を見つけるために必要な数のハッシュ値を計算することが不可能になる可能性があります。

2
Xander