[ad_1]
こんにちはグルシャンネギです
さて、Python でパスワード生成用のプログラムを書いていますが、実行中にエラーが表示されます。
ソースコード:
import secrets import string def create_pw(pw_length=12): letters = string.ascii_letters digits = string.digits special_chars = string.punctuation alphabet = letters + digits + special_chars pwd = '' pw_strong = False while not pw_strong: pwd = '' for i in range(pw_length): pwd = ''.join(secrets.choice(alphabet)) if (any(char in special_chars for char in pwd) and sum(char in digits for char in pwd) >= 2): pw_strong = True return pwd if __name__ == '__main__': print(create_pw())
私もその参照を取得しました ソースコード付きの 30 のクールで簡単で楽しい Python プロジェクト [2023][^] しかし、ここで何が欠けているのかわかりません。 誰でもこれについて提案できますか。
ありがとう
私が試したこと:
多くのリソースから参照していますが、プログラムを実行できません。
解決策 1
これを試して:
for i in range(pw_length): pwd = pwd + secrets.choice(alphabet)
しかし … それを生成する方法は非常に非効率的です。生成されたランダムなシーケンスが、パスワードを返すことを許可する基準を満たすという保証はありません。
これを修正するには 2 つの方法があります。1 つは特殊文字用、2 つは数字用の 3 つのインデックスを生成します。 「パスワードの作成」ループをループするときに、現在のインデックスを確認します。特殊文字インデックスと一致する場合は、それらのいずれかを追加します。数字インデックスのいずれかと一致する場合は、それらのいずれかを追加します。それ以外の場合は、文字を追加します。
そうすれば、結果の文字列は常に基準を満たし、生成時間は一貫します。
解決策 2
次の行が原因で、無限ループが発生しています。
for i in range(pw_length): pwd = ''.join(secrets.choice(alphabet)) # you replace pwd with a single character each time
したがって、コードは…
if (any(char in special_chars for char in pwd) and sum(char in digits for char in pwd) >= 2): pw_strong = True
…決して設定されません pw_strong = True
したがって、次のように変更します。
while not pw_strong: for i in range(pw_length): pwd += ''.join(secrets.choice(alphabet)) # append each character to the pwd variable, until it has pw_length characters
[edit]
見る secrets — 秘密を管理するための安全な乱数を生成する — Python 3.11.2 ドキュメント[^] secrets モジュールの推奨される使用法について。
[/edit]
[ad_2]
コメント