パスワード要件
まず、適切なパスワードが満たすべき要件を理解する必要があります。
- 拾うのは難しいに違いない。 十分な長さで、さまざまなタイプの文字(大/小文字、数字、特殊文字)が含まれている必要があります。これにより、網羅的な検索で選択できなくなります。 辞書、組み合わせおよび突然変異を含む辞書によって選択解除する必要があります。
- アカウントごとに一意である必要があります。これにより、あるアカウントのパスワードが危険にさらされても、他のアカウントに不正アクセスされることはありません。
- 定期的に変更する必要があります。
最初は、このように何ができるかを考えました。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進数として使用されます。
受信したレコードの下位24ビットは、左から右に低から高の順に表示され、生成されたパスワードです。
すべてのテキスト文字列は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ビットは、左から右に低から高の順に表示され、生成されたパスワードです。
そのようなパスワードを使用する実際の問題
一部のサービスでは、パスワードに含めることができる文字セットに制限があります。 生成されたパスワードに禁止文字が含まれている場合、それらをスキップする必要があります。 したがって、その後のサービスの使用では、どの文字がスキップされたかを覚えておく必要があります。
パスワードメモとの比較
パスワードメモと比較したこのようなアルゴリズムの利点:
- パスワードデータベースを手元に用意する必要はありません。 別のコンピューターでパスワードを取得するのに時間がかかりました-githubからプログラムをダウンロードし、マスターパスワードを操作しました-そして、パスワードデータベース全体を私と一緒に使いました。
- 攻撃者が盗んで解読しようとするファイルはありません。 真実は、優れたマスターパスワードを備えた優れたメモでは、パスワードデータベースの解読もほとんど信じられないことです。
- コンピューターへのフルアクセス(すべてのファイルの読み取りとキーロガーのインストール)を取得した場合でも、攻撃者はアカウント(特にこのコンピューターからアクセスされていないアカウント)のデータを推測する必要があります。
- 異なるランダムなパスワードの使用を保証します。 また、毎回パスワードを作成する必要はありません。
「記憶」の長所:
- マスターパスワードが危険にさらされた場合でも、クラッカーは暗号化されたファイルを取得してアカウントにアクセスする必要があります。 パスワードジェネレーターの場合、生成されたパスワードを使用するアカウントの詳細を調べるだけで済みます。 確かに、IMHO、攻撃者がマスターパスワードを取得できた場合、攻撃者のために暗号化されたパスワードデータベースも簡単に取得できます。
- 既存のパスワードを使用できます。
- 任意の文字セットから任意の構造のパスワードを覚えることができます。特定のサイトのパスワード制限に問題はありません。
次は何ですか
アカウントのデータベースもここに追加します。 そのため、データベースを復号化するには、マスターパスワードと、オプションでパスワードのみを入力する必要がありました。 また、サイト名、ログイン、バージョン番号、パスワードの長さ、スキップされた文字のリストをデータベースから取得できます。
同様のプログラム
コメントはもっとあることを示唆しました:
MasterPassword-ファンの趣味
pwdhash.comは、スタンフォード大学のチームのJavaScriptと同じです。 ブラウザ用のプラグインがあります。 ハッシュ後、パスワードは標準の複雑度テストに合格するように補足されます。