暗号理論 において、暗号学的ハッシュ関数は大きく2つのカテゴリに分類できます。1つ目のカテゴリは、数学的な問題に基づいて設計され、厳密な数学的証明、計算複雑性理論、形式的還元によって安全性が保証される関数です。これらの関数は、証明可能な安全性を持つ暗号学的ハッシュ関数と呼ばれます。これらの関数を構築することは非常に難しく、実際に紹介されている例はほとんどありません。そのため、実用化は限られています。
2番目のカテゴリには、数学的な問題に基づくものではなく、メッセージのビットを組み合わせてハッシュ値を生成するアドホックな構成に基づく関数が含まれます。これらの関数は解読が困難であると考えられていますが、正式な証明は示されていません。広く使用されているハッシュ関数のほぼすべてがこのカテゴリに属します。これらの関数の中には既に解読され、使用されなくなったものもあります。ハッシュ関数のセキュリティ概要を参照してください 。
一般的に、暗号学的ハッシュ関数の基本的なセキュリティは、原像耐性、第二原像耐性、衝突耐性、擬似乱数性など、さまざまな観点から捉えることができる。
根本的な問題は「難しい」の意味です。この問いに答えるには2つのアプローチがあります。1つ目は直感的・実践的なアプローチで、「難しいとは、システムのセキュリティが重要視されている限り、システムを破ることを阻止しなければならない攻撃者にとって、ほぼ確実に手の届かないものであることを意味する」というものです。2つ目は理論的なアプローチで、計算複雑性理論に基づいています。問題Aが難しい場合、整数因数分解や離散対数問題など、多項式時間では解けないと広く考えられている問題から、形式的なセキュリティ還元が存在します。
しかし、多項式時間アルゴリズムが存在しないからといって、システムが安全であるとは限らない。問題の難易度は、その大きさにも左右される。例えば、RSA公開鍵暗号(整数因数分解の難しさに依拠する)は、少なくとも2048ビット長の鍵を使用した場合にのみ安全とみなされるが、ElGamal暗号システム(離散対数問題の難しさに依拠する)の鍵は、一般的に256~512ビットの範囲である。
ハッシュへの入力のセットが比較的小さいか、何らかの方法で可能性によって順序付けられている場合、理論的なセキュリティに関係なく、総当たり検索が実用的である可能性があります。原像を復元できる可能性は、入力セットのサイズとハッシュ関数の計算速度またはコストに依存します。一般的な例として、パスワード検証データを保存するためにハッシュを使用することがあります。アクセス制御システムは、通常、ユーザーパスワードの平文を保存する代わりに、パスワードのハッシュを保存します。ユーザーがアクセスを要求すると、送信されたパスワードがハッシュ化され、保存されている値と比較されます。保存されている検証データが盗まれた場合、泥棒はパスワードではなくハッシュ値のみを入手します。ただし、ほとんどのユーザーは予測可能な方法でパスワードを選択し、パスワードは多くの場合十分に短いため、高速ハッシュを使用するとすべての可能な組み合わせをテストできます。[ 1 ]検索を遅くするために、鍵導出関数 と呼ばれる特別なハッシュが作成されています。パスワードクラッキングを参照してください 。
ほとんどのハッシュ関数はアドホックな方法で構築されており、メッセージのビットがうまく混合されてハッシュが生成されます。さまざまなビット演算(回転など)、モジュラー加算、圧縮関数が反復モードで使用され、出力の高い複雑性と擬似乱数性を保証します。このように、セキュリティを証明することは非常に難しく、証明は通常行われません。ほんの数年前、最も人気のあるハッシュ関数の 1 つであるSHA-1は、その長さが示唆するよりも安全ではないことが示されました。衝突は総当たり攻撃の数 2 80ではなく、わずか 2 51 [ 2 ]テストでしか見つかりませんでした。
言い換えれば、現在使用されているハッシュ関数のほとんどは、衝突耐性が証明されていません。これらのハッシュは、純粋に数学的な関数に基づいているわけではありません。このアプローチは一般的に、より効率的なハッシュ関数をもたらしますが、そのような関数の弱点が最終的に衝突を見つけるために悪用されるリスクがあります。有名な例としては、MD5が挙げられます。
このアプローチでは、ハッシュ関数の安全性は、ある難解な数学的問題に基づいており、ハッシュ関数の衝突を見つけることは、その基礎となる問題を解くことと同じくらい難しいことが証明されています。これは、従来のアプローチのようにビットの複雑な混合に頼るよりも、やや強力な安全性の概念を提供します。
暗号学的ハッシュ関数は、衝突の検出が、本来多項式時間では解けないとされる問題Pから多項式時間で還元可能であることが証明できる場合、衝突攻撃に対して証明可能な安全性を持つ。このような関数は、証明可能な安全性を持つ、あるいは単に証明可能であると呼ばれる。
つまり、アルゴリズムAによって衝突検出が多項式時間で実行可能であれば、アルゴリズムAを用いて問題Pを解く多項式時間アルゴリズムR (還元アルゴリズム) を見つけて使用できるということになります。問題 P は多項式時間では解けないと広く考えられています。これは矛盾です。つまり、衝突検出は問題Pを解くよりも容易ではないということです。
しかし、これは衝突の発見が場合によっては困難であることを示しているに過ぎず、計算困難な問題のすべてのインスタンスが必ずしも困難であるとは限らない。実際、NP困難問題の非常に大規模なインスタンスは日常的に解決されており、最も困難なインスタンスのみが事実上解決不可能である。
多項式時間では解けないと想定される問題の例としては、
SWIFFTは、これらのセキュリティ上の問題を回避するハッシュ関数の例です。推定時間t内に確率pでSWIFFTを破ることができる任意のアルゴリズムに対して、 tとpに応じて時間t ′内に特定の難しい数学的問題の最悪シナリオを解決するアルゴリズムを見つけることができることが示されています。[ 3 ]
hash( m ) = xm mod nとします。ここで、nは因数分解が難しい合成数、xはあらかじめ指定された基数です。衝突xm1 ≡ xm2 (mod n )は、 nを法とするxの乗法位数の倍数m1 − m2を明らかにします。この情報は、 xの特定の性質を仮定すれば、多項式時間でn を因数分解するために使用できます。
しかし、このアルゴリズムは、メッセージビットあたり平均1.5回のnを法とする乗算を必要とするため、非常に非効率的である。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ){{citation}}:欠落または空欄|title=(ヘルプ)