0

パスワード ハッシュを破ることが scriptkidies の新しい娯楽になったので、私はその問題について考え、斬新な (?) アイデアを思いつきました。

  1. パスをハッシュではなくオフセット+数値として保存します
  2. 数は 2 つの大きな素数の積です
  3. パスワードは数値に変換され、オフセットが追加され、その素数が数値の分割に使用されます。割り切れて、除数が 2 つの素数のうち大きい方の場合、パスワードは正しいです。

定義上、各ハッシュは一意であり、各パスワードはオフセットに応じてさまざまな方法でハッシュできます。1 つのハッシュを破るということは、数値を因数分解する必要があることを意味し (これは難しいことです)、それからより大きなプライム オフセットの数値に対応する単語を見つける必要があります (これは些細なことです)。

関数 f() を使用してパスワードをパスワード番号に変換する (重要ではありません) を生成するには、2^4096 より大きい 2 つのランダムな素数を生成します。大きい方の素数を取り、prime-passwordnumber=offset を計算します。素数を掛けると「数」になります。ストア番号とオフセット。

チェックする。関数 f() を使用してパスワードをパスワード番号に変換し、オフセットを追加して素数を見つけます。数を素数で割り、もう一方の素数を取得します。最初の素数が 2 つのうち大きい方であることを確認します。もしそうなら、パスワードは正しかった。

f() は、たとえば、大きな 2 進整数として理解されるパスワードの utf-8 エンコードである可能性があります。

4

3 に答える 3

0

スキームを形式化するには:

ハッシュを作成するには:

  1. ユーザーはパスワード pw を入力します
  2. エンコード関数 e を使用して pw をバイト配列 ba に変換します
  3. ba を大きな整数 bn に変換します
  4. 素数 p と q を求めます。p > q > max(bn, 2^2048)
  5. n = pq および o = p - bn を保存

ハッシュを検証するには:

  1. ユーザーはパスワード pw を入力します
  2. エンコード関数 e を使用して pw をバイト配列 ba に変換します
  3. ba を大きな整数 bn に変換します
  4. bn + o が n を除算することを確認する

これが安全なハッシュであるためには、与えられた n と o から pw を推測するのは現実的ではありません。つまり、推測やチェックよりも有利なアルゴリズムはありません。信じます。

私が見ているように、あなたのスキームの主な利点は、乱数を選択することによってハッシュプロセスにランダム性が注入されることです。それらが素数であり、因数分解が難しいはずであることは、実装の詳細です(それは一方向関数です)。おそらく、チェックも遅くなるはずですが、それほど大きな数値で除算がどれほど遅いかは本当にわかりません。

興味深いのは、ハッシュの作成とパスワードの検証プロセスが非常に異なることです。ご指摘のとおり、これにより、レインボー テーブル ハッシュ チェーンの手法が適用できなくなります。これは利点かもしれませんが、ユーザーごとのソルティングにより、レインボー テーブルから同様の保護が得られます。

于 2012-06-06T18:12:19.270 に答える
0

一般に、独自の暗号システムを発明しようとすることは、正しく行うのが非常に困難です。考慮しなければならない小さなことがたくさんあり、攻撃に悪用できる何かを見逃すのは簡単です。確立された暗号化ライブラリまたはハッシュ ライブラリを使用した場合でも、はるかに優れた安全性が得られます。ハッシュ用の Bcrypt は、おそらく投稿したソリューションよりもはるかに安全です。

于 2012-06-06T14:37:35.787 に答える