強力なパスワードを生成して記憶するという考え方

複雑で、一致しない、異なる、定期的に変更されるパスワードを使用することの重要性、およびそれらを記憶することの問題については誰もが知っていると思います。 原則として、この問題には比較的良い解決策があります-パスワードデータベースを暗号化された形式で保存するプログラム。 このようなパスワードメモよりもいくつかの利点がある、特に暗号化されたパスワードデータベースを持つファイルへのアクセスを必要としない代替ソリューションを共有したいと思います。 主なアイデアは、1つの非常に強力なマスターパスワードを記憶し、暗号化機能を使用してそこから個々のアカウントのパスワードを生成することです。 誰が詳細に興味があるのか​​-私は猫の下で尋ねます。



パスワード要件


まず、適切なパスワードが満たすべき要件を理解する必要があります。

  1. 拾うのは難しいに違いない。 十分な長さで、さまざまなタイプの文字(大/小文字、数字、特殊文字)が含まれている必要があります。これにより、網羅的な検索で選択できなくなります。 辞書、組み合わせおよび突然変異を含む辞書によって選択解除する必要があります。
  2. アカウントごとに一意である必要があります。これにより、あるアカウントのパスワードが危険にさらされても、他のアカウントに不正アクセスされることはありません。
  3. 定期的に変更する必要があります。


最初は、このように何ができるかを考えました。1つのランダムな文字列を覚えて、各サイトにそのサイト固有の文字列をドッキングします。 たとえば、サイトアドレスの3文字ごとに入力します。 ハブのパスワード(id。Tm t m。R uで入力 )は次のようになります。「Q9y:y> 1W.tr」、「Q9y:y> 1W」はすべてのサイトで使用される文字列、「。tr 「-id.tmtm.ruに固有の添加剤。 実際、生成アルゴリズム自体とランダム文字列という2つの秘密のコンポーネントがあります。 パスワードを取得するには、両方を知っている必要があります。 パスワードは破壊に対して非常に耐性があり、定期的にランダムドレインを変更できます-要件(1)および(3)が満たされています。 問題は、2つのサイトのパスワードを知っているため、両方のコンポーネントが比較的簡単に推測できることです。



一般的なアルゴリズム


次のステップは、不可逆的な暗号化機能の使用です。 ここでの秘密は、ランダムな行、つまりマスターパスワードのみです。

パスワードを生成するための初期データは次のとおりです。

テーブルについて
これは、侵入者が何らかの方法(フィッシング、ソーシャルエンジニアリング、サイトの脆弱性など)で人気のあるサイトからパスワードを受信できる場合の攻撃を意味します。 この場合、このようなパスワードジェネレーターを使用するがログインフィールドに入力しないユーザーのマスターパスワードを取得するために、レインボーテーブルを生成し、それらを反復処理できます。 もちろん、このような攻撃は、このパスワードジェネレーターの使用が普及している場合にのみ意味があります。



このデータはハッシュ関数の入力に送られ、出力は95整数システムでエンコードされた長整数とみなされ、160ビットのハッシュ関数の25文字長の擬似ランダム文字列を取得します。 主人公を折りたたむほうがいい すべての値(より正確には、5つの値のみ)にはほど遠い場合があります。 24の擬似ランダムsimovolが得られます。

文字の分布についてより正確に
実際、2 ^ 160は95の累乗ではないため、存在する可能性のある文字の値の確率分布は完全に均一ではありません。一部の文字は他の文字よりも高い確率で表示されることがわかります。 しかし、この不均一性は、最高桁から最低桁まで非常に迅速に(指数関数的に)減少します。 そのため(ハッシュ関数が理想的であり、その出力のすべての値が同じ確率であるという仮定の下で)、24番目(最高)の位置のシンボルは確率1 1 58011%および1. 0 51510%で表示されます。 23位-確率1.05 3 724%、1.05 1 753%、1.05 1 510%。 22位-確率1.0526 5 2%、1.0526 3 9%、1.0526 2 9%。 さらに、差はさらに小さくなります。 パスワードの場合、均一な分布からのこのような逸脱は実際には問題になりません。





具体的な実装


ここにPython3のシンプルなコンソールプログラムがあり、パスワードを生成します。

次のパラメーターのいずれかを指定できます。

-m-1つのマスターパスワードから多くのパスワードを生成します(マスターパスワードを何度も入力しないようにするため)。

-r-ランダムパスワードを生成します(ランダム性のソースは、ランダムシーケンスのシステムジェネレーターとキーボードから入力された行です)。

パラメータなし-1つのパスワードを生成して終了します。

マスターパスワードを入力するとすぐに、プログラムはマスターパスワードから2バイトのハッシュを表示します。 これは、入力の正確さを制御するために必要です。 ハッシュになじみがない場合は、マスターパスワードが正しく入力されていません。

このプログラムは、2つの異なるハッシュ関数(ripemd160とsha512)を使用し、文字列の連結よりも少し混乱した順序で元のデータを供給します。 2つの機能(偏執的な機能への移行)を使用すると、非常に深刻な脆弱性がその1つに見つかった場合でも、アルゴリズムの暗号の安定性を維持できます(これはほとんど信じられないことですが、そのような「偏執症」のオーバーヘッドも最小限です)。

正確なアルゴリズム
SitePwd = ripemd160(ver2str(バージョン)+ sha512_hex(ver2str(バージョン)+ master_password +サイト+ログイン)+サイト)

すべてのテキスト文字列はUTF-8でエンコードされています。 「+」は文字列の連結を意味します。

ver2str(n)関数は、次のように、n + 0の連続するn + 1の数字が連続して書き込まれた文字列を返します。

ver2str(0)= '0'

ver2str(4)= '43210'

ver2str(12)= '1211109876543210'

SitePwdはさらに長整数に変換され、95桁の数値システムで記述されます。 chars配列の文字(合計95文字)は、95の10進数として使用されます。
chars = "`1234567890-=\~!@#$%^&*()_+|qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:"zxcvbnm,./ZXCVBNM<>? "
      
      



(外部引用符がない場合、最後の文字はスペースです)

受信したレコードの下位24ビットは、左から右に低から高の順に表示され、生成されたパスワードです。





そのようなパスワードを使用する実際の問題


一部のサービスでは、パスワードに含めることができる文字セットに制限があります。 生成されたパスワードに禁止文字が含まれている場合、それらをスキップする必要があります。 したがって、その後のサービスの使用では、どの文字がスキップされたかを覚えておく必要があります。



パスワードメモとの比較


パスワードメモと比較したこのようなアルゴリズムの利点:



「記憶」の長所:



次は何ですか


アカウントのデータベースもここに追加します。 そのため、データベースを復号化するには、マスターパスワードと、オプションでパスワードのみを入力する必要がありました。 また、サイト名、ログイン、バージョン番号、パスワードの長さ、スキップされた文字のリストをデータベースから取得できます。



同様のプログラム


コメントはもっとあることを示唆しました:

MasterPassword-ファンの趣味

pwdhash.comは、スタンフォード大学のチームのJavaScriptと同じです。 ブラウザ用のプラグインがあります。 ハッシュ後、パスワードは標準の複雑度テストに合格するように補足されます。



All Articles