質問

まず、コンテクスト:クコマンドラインツール(Linuxの場合) 要するにログインできます。にこのツールを持たない システムレベルの計--なので、/etc/passwd.

を計画してい店ユーザーアカウントにテキストファイルと同じフォーマット(約)/etc/passwd.

ていないにもかかわらず利用システムレベルのパスワードファイルを使用し、ょう すると良い実践として使用することに反対しパスワードの保存 cleartext.(Cryptは確かによく保存パスワード cleartextいを行います。)

私cryptの知識に基づきます:https://docs.python.org/2/library/crypt.html

のようお願いいものができないから:"で ご利用をお勧めのcryptedパスワードとしての塩が確認 パスワード."

あれ?もし僕の作成cryptedパスワードとして、作成時にユーザー 録はどうやって使うことができまcryptedパスワードとして塩?で 存在しない。(いしたと仮定すると、あなたものを使用しなければな塩の作成とチェック、パスワードになります。)

たっての平文パスワードとして、塩です。これは 仕事が二つの問題一容易に克服し、深刻:

1)最初の二つの文の平文パスワードが含まれま cryptedパスワードになります。できることにより、これを解決しない文書の 文字のファイル:

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

2つの平文パスワードの塩としては、どちらかと言うと 量の削減エントロピーされます。あん 誤解を目的とした。

最高の練習でもしっかり入れている利用の 文字からユーザのユーザ名としました。うことは適切であると思われる一方、 やはり何かと私は見ることは悪い動くのか?

私の理解の塩であることを防止プレコンピューティングパスワード ハッシュから辞書で調べました。使うことがで標準の塩のためのすべて パスワードなどの私の頭文字,"JS,"だと思われるの の負担が攻撃者によ用文字からそれぞれのユーザーのユーザ名です。

役に立ちましたか?

解決

cryptモジュールの使用:

暗号化されたパスワードを生成するとき、ソルトを提供します。リストされている条件を満たしている限り、ブルートフォーシングに対する抵抗力を高めるのはランダムな場合もあります。パスワードを確認するとき、より大きなソルトサイズをサポートしているシステムで自分で生成していない場合は、getpwnameから値を提供する必要があります。

一般的なコメント:

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

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

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

他のヒント

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

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

key is a user’s typed password.
salt is a two-character string chosen from the set [a–zA–Z0–9./]. 
This string is used to perturb the algorithm in one of 4096 
different ways.

エンファシスは「 2文字文字列」にあります。さて、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 さまざまな方法"とどのように関係するかです。

だ誤解し、文書化その長さが塩によって異なり、裏付crypt()の実装では、すで提供し、全体cryptedパスワードとしての塩値 チェック時のパスワード.それは、代引きの文字をオフには、塩だけで投げになることになります。

アイデアの最初の塩基づき、ユーザー名だそうです。

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

  1. 一般に、ランボーテーブルを計算するにはコストがかかりすぎるため、塩が使用されます。したがって、すべてのパスワードハッシュに少しランダム化したソルトを追加し、ハッシュされたパスワード値の横にプレーンテキストで保存する必要があります。
  2. HMAC を使用します。これは優れた標準であり、パスワードを連結したり、塩。
  3. SHA1を使用:MD5が壊れています。これを知っていれば、攻撃は意図されておらず、徹底的です。 ;)

私はソルトをパスワードの関数にしない。攻撃者は、パスワードのインスタントルックアップデータベースを作成するために、レインボーテーブルを生成する必要がありますが、一度だけ実行する必要があります。ランダムな32ビット整数を選択した場合、2 ^ 32テーブルを生成する必要があります(決定論的なソルトとは異なり)。

追加の強度を得るには、フォーマットでソルトを使用してcryptモジュールにmd5を使用させることができます。

$1$ABCDEFGH$

ABCDEFGHはソルト文字列です。

>>> p = crypt.crypt('password', '$1$s8Ty3/f

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

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

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

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

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

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

Bj&#の記事 TrueCryptの説明をご覧ください。 246; rn Edstr&#246; m truecryptの仕組みのわかりやすい説明と、truecryptの機能の単純なPython実装パスワード管理を含むが含まれています。

  

彼はPythonのTrueCryptではなく、Python crypt()モジュールについて話している

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top