NP完全問題を使用したパスワードハッシュ


16

一般的に使用されるパスワードハッシュアルゴリズムは、今日このように機能します。パスワードをソルトし、KDFにフィードします。たとえば、PBKDF2-HMAC-SHA1を使用すると、パスワードハッシュプロセスはになりDK = PBKDF2(HMAC, Password, Salt, ...)ます。HMACは埋め込みキーを使用した2ラウンドハッシュであり、SHA1は一連の置換、シフト、回転、ビット単位の操作であるため、プロセス全体は基本的に特定の方法で編成された基本的な操作です。基本的に、彼らが実際に計算するのがどれほど難しいかは明らかではありません。これがおそらく一方向関数が依然として信念である理由であり、歴史的に重要な暗号化ハッシュ関数のいくつかが安全ではなく非推奨になっているのを見てきました。

NPの完全な問題を活用して、パスワードをまったく新しい方法でハッシュすることが可能かどうか疑問に思い、より強固な理論的基礎を提供したいと考えました。重要な考え方は、P!= NP(P == NPの場合OWFがない場合、現在のスキームも壊れる)と仮定すると、NPCの問題であるということは、答えは検証しやすいが計算が難しいことを意味します。このプロパティは、パスワードハッシュの要件に適しています。パスワードをNPCの問題に対する答えと見なすと、NPCの問題をパスワードのハッシュとして保存して、オフライン攻撃に対抗できます。パスワードを確認するのは簡単ですが、解読するのは困難です。

警告は、同じパスワードがNPC問題の複数のインスタンスにマッピングされる場合があり、おそらくすべてを解決するのが難しいわけではありません。この研究の最初のステップとして、私はバイナリ文字列を3-SAT問題への答えとして解釈し、バイナリ文字列が解決策である3-SAT問題のインスタンスを構築しようとしていました。最も単純な形式では、バイナリ文字列にはx_0、x_1、x_2の3ビットがあります。次に、2 ^ 3 == 8句があります。

000 (    (x_0) v    (x_1) v    (x_2) )
--------------------------------------
001 (    (x_0) v    (x_1) v NOT(x_2) )
010 (    (x_0) v NOT(x_1) v    (x_2) )
011 (    (x_0) v NOT(x_1) v NOT(x_2) )
100 ( NOT(x_0) v    (x_1) v    (x_2) )
101 ( NOT(x_0) v    (x_1) v NOT(x_2) )
110 ( NOT(x_0) v NOT(x_1) v    (x_2) )
111 ( NOT(x_0) v NOT(x_1) v NOT(x_2) )

バイナリ文字列が000であると仮定します。その後、8句のうち1句のみが偽(最初の句)になります。最初の句と残りの7つの句を破棄すると、000は結果の数式の解になります。したがって、式を保存すると、000を検証できます。

問題は、3ビット文字列の場合、7つの異なる句が表示されると、どの句が欠落しているかがすぐにわかり、それがビットを明らかにすることです。

それで、そのうち3つを破棄し、001、010、100、111でマークされた4つだけを保持することにしました。衝突は常に発生するとは限りませんが、入力にさらにビットがある場合に衝突が確実に消滅するかどうかはまだわかっていません。

編集。バイナリ文字列が(000、001、...、111)のいずれかになる一般的な場合、7が真で1が偽である8つの節がまだあります。真理値(001、010、100、111)を与える4つの句を選択します。これは、以下のプロトタイプ実装に反映されています。

編集。以下の@DWが示す回答のように、句を選択するこの方法では、指定された変数セットに対して句が多すぎるため、値をすばやく絞り込むことができます。合計7 * C(n、3)句の中から句を選択する代替方法があります。たとえば、指定された変数セットから異なる数の句を選択し、隣接する変数((x_0、x_1、x_2)、(x_1、x_2、x_3)、(x_2、x_3、x_4)、.. 。)したがって、クリークの代わりにサイクルを形成します。直感的にすべての句が満たされるかどうかをテストするために帰納法を使用して割り当てを試すことができるため、この方法はうまく機能しない可能性があります。したがって、全体的な構造を簡単に説明するために、現在のメソッドを使用してみましょう。

nビット文字列の句の数は4 * C(n、3)= 4 * n *(n-1)*(n-2)/ 6 = O(n ^ 3)です。これは、ハッシュはパスワードのサイズの多項式です。

Pythonにはプロトタイプの実装があります。ユーザー入力のバイナリ文字列から3-SAT問題のインスタンスを生成します。


この長い紹介の後、最後に私の質問:

  1. 上記の構成(プロトタイプで実装されている)は、安全なパスワードハッシュとして機能しますか、または少なくとも有望に見えますが、修正などが可能ですか?そうでない場合、どこで失敗しますか?

  2. 選択できる7 * C(n、3)句があるため、おそらくランダム化の助けを借りて、パスワードハッシュとしての使用に適した安全な3-SATインスタンスを構築する別の方法を見つけることは可能ですか?

  3. NPの完全性を活用して、実証済みの安全なパスワードハッシュスキームを設計しようとして、既にいくつかの結果(肯定的または否定的)を得ている類似の作業はありますか?いくつかのイントロとリンクは大歓迎です。


編集。以下の回答を@DWが受け入れます。彼は最初に返信し、問題の構造と有用なリソースについて優れた洞察を提供しました。ここで紹介した単純な句選択スキーム(Pythonプロトタイプで実装されている)は、小さなグループで変数の割り当てをすばやく絞り込むことができるため、機能していないようです。ただし、このようなNPCからPasswordHashingへの削減がまったく機能しないことを示す正式な証拠を見たことがないため、問題は未解決のままです。この特定の3-SATリダクション問題に対しても、ここで列挙したくない節を選択するさまざまな方法があるかもしれません。そのため、更新やディスカッションは大歓迎です。


節の生成をsatソルバー(pycosatを使用したpicosat)にプラグインしました。nbits = 300の場合、最も長いのは句を生成することであり、pycosatはインスタンスを強制終了します。句の生成は実際には非常に長いため、私は300を超えませんでした。また、0 ... 0は常にあなたの世代のソリューションです。このような「簡単な」ソリューションが常にある場合、これは機能しません。
holf

回答:


17

残念ながら、これは機能していないようで(詳細については以下を参照)、この種のアイデアを証明可能な安全なスキームにする方法を見つけるのは難しいようです。

あなたの一般的なアイデアの問題

NP完全問題に基づいて暗号化を試みるという考えを最初に考える人はいないでしょう。問題は、NP硬度は最悪の場合の硬度のみを保証するが、暗号化には平均的な場合の硬度が必要であることです。NP完全問題(ナップザック暗号システムなど)に基づいて暗号化を試みる複数の試みがありましたが、うまくいきませんでした。一般的に起こることは、最悪の場合は指数関数的であるにもかかわらず、人々は平均的に(または自明でない確率で)有効であることが多いアルゴリズムを発見することです。これは、NPの硬度と矛盾しない場合でも、暗号を破るのに十分です。

NP困難な問題に依存するポイントは、おそらくスキームに対して何らかの証明可能なセキュリティを確保することです(たとえば、P NP であれば、暗号システムは安全です)が、最悪の場合と平均的な場合の違いのためそのような結果は実際には続きません。そのような結果を取得する暗号システムを構築する方法は明確ではありません。

このテーマについてもっと読むことをお勧めします。あなたは、いくつかの有用な出発点を見つけることができます暗号化におけるNP-難しい問題の重要性を一方向関数以外の平均ケースの複雑開い問題Impagliazzoの世界の状況?最悪の場合から平均的な場合の削減

特定のスキームの問題

特定の提案が完全に指定されていません。スキームを分析するには、スキームの仕組みを完全に指定する必要があります。あなたの場合、一般的な例で7つの節のうち4つを選択する方法は明確ではありません。(そして、1つの例は、一般的な方法を説明する仕様の代わりではありません。)

とはいえ、これらの詳細をどのようにインスタンス化しても、スキームは簡単に破られるようです。直観的に、非常に多くの句を含む3SATインスタンスは通常簡単です。より具体的には、スキームによって生成される3SATインスタンスのタイプを解決する攻撃について説明します。まず、を回復してみましょう。これらの変数のみに言及する(他の変数には言及しない)句のみに注目してください。3つの変数のサブセットを選択する10の方法があるため、このような句は40個あるはずです。これらの5つの変数には割り当てが可能なため、それらすべてを試して、40節のいずれかによって違反された割り当てをすべて破棄します。これにより、すべての句と一致する割り当てが約1つだけになると予測します。x0,x1,x2,x3,x425

(3つの変数の各サブセットについて、4節は私たちを絞り込むのはなぜ?これだけ割り当てのは、これらの4句と一致している。我々は10の、このようなサブセットを持っているので、発見的に我々はチャンスを期待して、誤った割り当てが一貫していること10個のサブセットすべてが約1/2であり、不正な割り当てが考えられるため、これらのサブセットのほとんどがこれらのテストに耐えることはできません。誤った割り当ては、確率で単一の句を満たします。したがって、発見的には、40のすべての句を満たす確率は約1/21/2107 / 8 7 / 8 402 - 7.72 5 - 1 × 2 - 7.70.152517/8(7/8)4027.7。したがって、40のすべての句と一致する誤った割り当ての予想数は、約です。そのため、通常、すべての誤った割り当ては削除され、正しい割り当てのみが残されます。)(251)×27.70.15

これは、5つの変数のグループごとに繰り返して、それぞれの一意の満足できる割り当てを一意に回復できます。あいまいさがある場合は、候補の割り当てを他の句と照合できます。

このように、通常はプロシージャによって生成された3SATインスタンスのクラスを解決する効率的なアルゴリズムがあることがわかります。すべての3SATインスタンスを解決するわけではありませんが、生成するインスタンスには特別な構造があり、その特別な構造を持つインスタンスを効果的に解決します。これはポイントをよく示しています:3SATの一部のインスタンスは他のインスタンスよりも簡単であり、3SATの難易度(最悪の場合の複雑さ)は、生成する特別なインスタンスの難易度または平均3SATインスタンスの難易度についてほとんど、またはまったく言及しません。


完全な仕様として機能するリファレンス実装があります。この最初の試みでは、スキームは本当に簡単です。パスワードを置き換えるときに001、010、100、111を与える4つの句を選択しました。これにより、句ごとに8つの有効な組み合わせが4つ与えられます。
サイカー

あなたはおそらく、この迅速な解決策を迅速に解決することを可能にするあまりにも多くの句を与えることは正しいでしょう。ただし、O(n ^ 3)句から始めて、どちらを保持するかを自由に選択できます。トリプレットは独立していない場合があります。したがって、発見的な分析がまだ保持されているかどうかにかかわらず、簡単な問題のインスタンスを削除しようとするパターンで句が選択されているかどうか疑問に思っています。
サイカー

1
しかし、より興味深いのは、大まかに言えば、平均的なNPCの問題はありませんか?
サイカー

1
@Cyker、あなたは絶対に正しい。厳密に言えば、確率が独立しているという保証がないため、確率を掛けることはできません。これは、アルゴリズムがどの程度うまく機能するかを予測するためのヒューリスティックです。ヒューリスティックは間違っている可能性があります。最終的なテストは、アルゴリズムを実装し、それが機能するかどうかを確認することです。
DW

2
1つの簡単なテストは、SATソルバーでインスタンスを試すことです。SAT Solversはインスタンスで効率的だと思いますが、仕様を完全に理解しようとしませんでした。10000変数インスタンスを生成し、SATソルバーを実行してみてください(ちなみに、パディング/
ソルト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.