まず、コンテキスト: ログインが必要なコマンドライン ベースのツール (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 文字を使用するよりも負担が少ないようです。