web-dev-qa-db-ja.com

元のデータとSHA-2アルゴリズムを使用するハッシュ出力を知っている場合、ソルトを解決するのはどれほど難しいか

ハッシュを使用してクエリ文字列を検証することを説明しているKenticoのドキュメントを読んでいます

EX:http://localhost/KenticoCMS8/cms/getfile/2d003444-9a27-43c9-be97-4f5832474015/Partners_logos_silver.aspx?latestfordocid=75&hash=eee41e027bd45142fd1f44d173d61950f34d6e98f4e35018fda70542322adc77&chset=013bca78-6bf2-42ac-8959-b8bbbeb0a8e8

ドキュメント https://docs.kentico.com/display/K8/Query+string+hashing

私は仮定を立てています:それ自体でクエリ文字列をハッシュし、それを文字列の一部として含めることは役に立ちません。アルゴリズム(ヘルプドキュメントで公開)を知っている人なら誰でも、新しい悪意のあるクエリ文字列からハッシュを生成し、それをリクエストの一部として含めることができます。

Kenticoが使用する追加の保護は、クエリ文字列をハッシュするときに含まれる静的ソルトです。これにより、独自のハッシュの生成がそれほど単純ではなくなるはずです。

私の質問は、この塩を解決するのはどれほど難しいでしょうか?攻撃者は、さまざまなクエリ文字列を簡単に生成できます。攻撃者は、入力、出力、およびアルゴリズムを知っています。彼らは単に塩を理解することができますか?

そして、彼らがソルトを知っている場合、彼らは問題なく独自のクエリ文字列を生成できますか?

2
Andrey

暗号化ハッシュは、原則として元に戻すことはできません。したがって、ブルートフォースを試みる以外に、既知のクエリ文字列と関連するハッシュ(またはそれらのセット)を取得してそれらを逆にすることによってソルトを取得することはできないはずです。ブルートフォースは、32個の16進文字を持つランダムなGUIDでは実行できません(1つの16進文字は4ビットであるため、GUIDは128ビットです)。したがって、塩のブルートフォースでは、作成するハッシュを2 ^ 128まで作成する必要があります(ハッシュが2 ^ 127以下の場合の半分の時間)。一方、2 hex-character-saltを使用した場合、ブルートフォースは2 ^ 8 = 256SHA-2ハッシュのみで簡単になります。

この分析は、SHA-2に対する新しい未公開の攻撃が存在しないこと、またはすべて同じソルトで始まる任意のテキストの複数のハッシュを作成できることにより、この拡張された攻撃対象領域を利用する攻撃が存在しないことを前提としています。このシナリオは、 関連キー攻撃 に少し似ているように見えます。このシナリオでは、関連するいくつかの不明なキーを使用して誰かにデータを暗号化させることができるため、暗号を破る(復号化キーを見つける)ことができます。数学的な意味で(一部のビットは異なりますが、ほとんどは同じです)。

ただし、SHA-2またはその他のハッシュに対するそのような攻撃を認識しておらず、問題が活発に議論されているのを見たことがありません。次の「H(s ++ p1)= h1、H(s ++ p2)= h2、...、H(s ++ pN)= hN) "recover s。通常、ハッシュ関数に関して3つの攻撃について考えます。プレイメージ抵抗(H(m) find mによって生成されたhが与えられた場合)、2番目のプレイメージ抵抗(m1がH(m1) = H(m2 ))、および衝突耐性(H(m1)= H(m2)となるような2つの異なるm1、m2を見つけます)。これは何か違うものです。

個人的には、 雪崩効果 のため、このタイプの攻撃がSHA-2(64ラウンド)のような最新の暗号化ハッシュでどのように機能するか想像できませんが、引用すると シュナイアーのlaw 「誰でもセキュリティシステムを発明できるので、それを破る方法を想像することはできません。」それが広範囲に研究されていないという事実は、ハッシュ関数が非常に洗練された攻撃者に対するこのタイプの効果に耐性があると私に確信させません。

2
dr jimbob