1

私は、tkinter モジュールを使用して Python で単一ユーザー用のプログラムを作成する小さな uni プロジェクトに取り組んでいます。パスワードの入力を求める画面を作りたい。これを行う方法がわかりません。また、パスワードをどこに保存しますか?

データベースの経験はありませんが、MD5 と SHA256 について聞いたことがあります。ハッシュ化または暗号化されたパスワードをテキスト ファイルに書き込んでから読み取ることを考えていましたが、これが安全かどうかはわかりません。

パスワード機能は、他のユーザーがユーザーの個人的な日記エントリを見るのを防ぐためのものです。

4

1 に答える 1

2

この答えは、セキュリティ対策を達成するための最も簡単な方法です。@JFSebastian はコメントで、暗号化を強化してより堅牢なセキュリティ手順を確実に検討できると指摘していますが、これは実際にはニーズに依存します。

実験を行い、概念実証のログイン システムを作成することが目標である場合は、暗号化 + フラット ファイル アプローチを使用できます。パスワードを保存するには、暗号化するのはパスワードのバリエーションであり、機密データ自体ではないため、おそらく SHA1 のみが必要です。つまり、データ自体は気にしないということです。暗号化の結果を比較することだけを気にします...

最初に、シークレット キャラクター セットを「ソルト」として選択します。残念ながら、コンパイルされていない言語を使用しているため、ソルトはおそらくプログラム内に存在します。ただし、少なくともパスワード ファイル自体は使用できません。(ここでは「ソルト」が唯一のシークレット値として使用されています。より安全なアプローチでは、シークレットはパスワード + ソルトのハッシュの外部で使用される別のキーになります)

import hashlib
salt = "-WOu@p.Za,>W+6&`A63/"
user_password = "password"
sha1 = hashlib.sha1()
sha1.update(user_password + salt)
encrypted = sha1.hexdigest()
print encrypted
# 476dc4076d1c7eb43152b78e9dc20d892f660f24

その暗号化された sha1 値をファイルに保存できます。秘密の塩の値がなければ、誰にも役に立ちません。この値を使用して、ユーザー認証時の将来の sha1 値と比較するだけです。

test_sha1 = hashlib.sha1(raw_input("Enter password: ") + salt).hexdigest()
# Enter password:  password
print encrypted == test_sha1
# True

実際に彼らのパスワードを知ることはありません。それから派生した sha1 値とソルトだけがわかります。これは、2 人の警備員がそれぞれ鍵を提供する必要があり、金庫を開けるために同時に回す必要があると考えてください。

それ以外の場合は....これをソルト値とともにデータベースに保存できます。手順は同じですが、ソルトを照会するためにも認証が必要な、より安全な場所にソルトを移動します。何があっても、塩の秘密は最も貴重な所有物です。

SHA256 への対処... 保護が必要な具体的な形式で実際のデータを保存する行為には、より高度な暗号化アルゴリズムが必要です(または、パスワードのハッシュ処理を遅くして、ブルート フォース クラッキングの実行に時間がかかるようにする場合)。たとえば、ユーザーのプライベートな日記エントリを保存することにした場合、パスワードに対して暗号化し、この暗号化された形式のみをディスクまたはデータベースに保存します。ユーザーが認証されると、パスワードを使用して復号化されたデータをユーザーに配信できます。パスワードを保存することはないため、ソフトウェアの作成者であっても、元のパスワードがなければデータにアクセスできません。

繰り返しますが、@JFSebastian が指摘しているように、より堅牢なアプローチは bcrypt ライブラリを使用することです: http://www.mindrot.org/projects/py-bcrypt/

于 2012-06-10T05:27:41.327 に答える