9

まず、コンテキスト: ログインが必要なコマンドライン ベースのツール (Linux) を作成しようとしています。このツールのアカウントは、システム レベルのアカウントとは何の関係もありません。これは /etc/passwd を調べません。

/etc/passwd と (ほぼ) 同じ形式を使用して、ユーザー アカウントをテキスト ファイルに保存することを計画しています。

システム レベルのパスワード ファイルを使用していないにもかかわらず、パスワードをクリアテキストで保存するのではなく、crypt を使用することをお勧めします。(crypt は確かにパスワードを平文で保存するよりも優れていますが、私はこれを行う他の方法にもオープンです。)

私の暗号の知識はこれに基づいています: https://docs.python.org/2/library/crypt.html

ドキュメントは、不可能なことを要求しているようです:「パスワードをチェックするときは、暗号化された完全なパスワードをソルトとして使用することをお勧めします。」

は?暗号化されたパスワードを作成している場合 (ユーザー レコードを作成する場合など)、暗号化されたパスワードをソルトとして使用するにはどうすればよいですか? まだ存在しません。(パスワードの作成と確認には同じソルトを使用する必要があると想定しています。)

プレーンテキストのパスワードをソルトとして使用してみました。これは機能しますが、2 つの問題があります。1つは簡単に克服でき、もう1つは深刻です。

1) 暗号化されたパスワードには、平文パスワードの最初の 2 文字が含まれています。最初の 2 文字をファイルに書き込まないことで、これを修正できます。

user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)

2) 平文のパスワードをソルトとして使用することで、システム内のエントロピーの量を減らしているように見えます。おそらく私は塩の目的を誤解しています。

私が導き出したベスト プラクティスは、ユーザー名の最初の 2 文字をソルトとして使用することです。これは適切でしょうか、それとも私が見逃したことが悪い動きになるのでしょうか?

ソルトについての私の理解は、辞書からのパスワードハッシュの事前計算を防ぐということです。すべてのパスワードに標準のソルト (私のイニシャル「JS」など) を使用できますが、攻撃者にとっては、各ユーザーのユーザー名から 2 文字を使用するよりも負担が少ないようです。

4

8 に答える 8

7

Python の crypt() は、システムの crypt() 関数のラッパーです。Linux crypt() man ページから:

char *crypt(const char *key, const char *salt);

key は、ユーザーが入力したパスワードです。
salt は、セット [a–zA–Z0–9./] から選択された 2 文字の文字列です。
この文字列は、4096 のいずれかでアルゴリズムを混乱させるために使用されます。
違う方法。

「二文字列」に重点が置かれています。ここで、Python での crypt() の動作を見ると、次のようになります。

>>> crypt.crypt("Hello", "World")
'Wo5pEi/H5/mxU'
>>> crypt.crypt("Hello", "ABCDE")
'AB/uOsC7P93EI'

結果の最初の 2 文字は、元のソルトの最初の 2 文字と常に一致することがわかります。これは、実際に真の 2 文字のソルト自体を形成します。つまり、crypt() の結果は、2char-salt + encrypted-pass の形式になります。したがって、2 文字のソルトまたは元の多文字のソルトを渡す代わりに、暗号化されたパスワード全体を渡しても、結果に違いはありません。

注: セット [a–zA–Z0–9./] には 64 文字が含まれ、64*64=4096 です。2 人のキャラクターが「4096通りの方法」にどのように関係しているかを次に示します。

于 2008-12-01T04:20:23.523 に答える
4

crypt モジュールを使用するには:

暗号化されたパスワードを生成するときは、ソルトを提供します。リストされた条件を満たしている限り、ブルートフォースに対する耐性を高めるのはランダムかもしれません。パスワードをチェックするときは、getpwname から値を提供する必要があります。これは、より大きなソルト サイズをサポートするシステムを使用していて、自分で生成しなかった場合に備えてです。

一般的なコメント:

これが実際のシステム ログインと関係がない場合、crypt よりも強力な方法を使用することを妨げるものは何もありません。ユーザーごとに N 文字のソルトをランダムに生成し、SHA-1 ハッシュでユーザーのパスワードと組み合わせることができます。

string_to_hash = user.stored_salt + entered_password
successful_login = (sha1(string_to_hash) == user.stored_password_hash)

更新: これはレインボー テーブルに対してはるかに安全ですが、上記の方法にはまだ暗号化の弱点があります。HMAC アルゴリズムを正しく適用すると、セキュリティをさらに強化できますが、私の専門知識の範囲を超えています。

于 2008-12-01T03:54:55.897 に答える
3

ドキュメントを誤解しています。ソルトの長さは基礎となる crypt() 実装によって異なる可能性があるため、パスワードを確認するときに、暗号化されたパスワード全体をソルト値として提供する必要があると書かれています。つまり、最初の 2 文字を塩にする代わりに、全体を投げ入れるだけです。

ユーザー名に基づいて最初のソルトを設定するというあなたの考えは問題ないようです。

于 2008-12-01T03:51:59.540 に答える
3

パスワードのソルティングに関する一般的なアドバイスを次に示します。

  1. 一般に、ソルトはランボウ テーブルの計算コストが高すぎるようにするために使用されます。したがって、すべてのパスワード ハッシュにランダム化されたソルトを少し追加し、ハッシュ化されたパスワード値の隣に平文で保存する必要があります。
  2. HMACを使用してください。これは優れた標準であり、パスワードとソルトを連結するよりも安全です。
  3. SHA1 を使用: MD5 が壊れています。これを知っていれば、悪気はありません。徹底しているだけです。;)

ソルトをパスワードの関数にすることはありません。攻撃者は、レインボー テーブルを生成してパスワードのインスタント ルックアップ データベースを作成する必要がありますが、それを行う必要があるのは 1 回だけです。ランダムな 32 ビット整数を選択すると、2^32 のテーブルを生成する必要があり、(決定論的なソルトとは異なり) 非常に多くのメモリ (および時間) を消費します。

于 2008-12-01T04:01:13.140 に答える
2

強度を高めるために、フォーマットでソルトを使用して、crypt モジュールで md5 を使用することができます。

$1$ABCDEFGH$

ここで、ABCDEFGH はソルト文字列です。

>>> p = crypt.crypt('password', '$1$s8Ty3/f$')
>>> p
Out: '$1$s8Ty3/f$0H/M0JswK9pl3X/e.n55G1'
>>> p == crypt.crypt('password', p)
Out: True

(これは crypt の gnu 拡張であることに注意してください。Linux システムの「man crypt」を参照してください)。MD5 (および現在は SHA1 でさえ) は「壊れている」可能性がありますが、パスワード ハッシュには比較的優れており、md5 は依然として Linux ローカル パスワードの標準です。

于 2008-12-01T16:09:13.000 に答える
1

PBKDF2を使用してください。別のスレッド(Python実装を含む)に関するこのコメントを参照してください。

于 2008-12-01T19:12:07.840 に答える
1

パスワード、またはパスワードから派生したものは決してソルトとして使用しないでください。特定のパスワードのソルトは予測不能であるべきです。

ユーザー名またはユーザー名の一部は許容されますが、暗号化された RNG からのランダムなバイトはさらに良いでしょう。

于 2008-12-01T04:40:02.860 に答える
-2

Björn Edström がTrueCrypt について説明した記事をご覧ください。truecrypt がどのように機能するかについてのわかりやすい説明と、パスワード管理を含むtruecrypt の機能のいくつかの単純な Python 実装が含まれています。

彼は Python の crypt() モジュールについて話しているのであって、Python の TrueCrypt についてではありません。

Python 2 のデフォルトcrypt.crypt()はあまり安全ではありません。この記事では、より安全な代替手段がどのように機能するかについて説明しています。

于 2008-12-07T01:01:21.220 に答える