【解決方法】Python パスワード生成プログラム エラー

プログラミングQA


こんにちはグルシャンネギです
さて、Python でパスワード生成用のプログラムを書いていますが、実行中にエラーが表示されます。
ソースコード:

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

次の行が原因で、無限ループが発生しています。

Python
for i in range(pw_length):
    pwd = ''.join(secrets.choice(alphabet)) # you replace pwd with a single character each time

したがって、コードは…

Python
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

したがって、次のように変更します。

Python
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]

コメント

タイトルとURLをコピーしました