1. ホーム
  2. python

[解決済み] Pythonでパスワードを生成する

2023-08-10 23:03:31

質問

Pythonで英数字のパスワードを生成したいです。いくつかの可能な方法は、次のとおりです。

import string
from random import sample, choice
chars = string.letters + string.digits
length = 8
''.join(sample(chars,length)) # way 1
''.join([choice(chars) for i in range(length)]) # way 2

しかし、私はどちらも好きではありません。

  • 方法1 一意な文字だけが選択され、長さが > len(chars) のパスワードは生成できません。
  • 方法2 私たちは i 変数が未使用であり、私はそれを避けるためにどのように良い方法を見つけることができません。

それで、他の良いオプションがありますか?

追伸:ここで、いくつかのテストとして timeit を使って100000回繰り返したところです。

''.join(sample(chars,length)) # way 1; 2.5 seconds
''.join([choice(chars) for i in range(length)]) # way 2; 1.8 seconds (optimizer helps?)
''.join(choice(chars) for _ in range(length)) # way 3; 1.8 seconds
''.join(choice(chars) for _ in xrange(length)) # way 4; 1.73 seconds
''.join(map(lambda x: random.choice(chars), range(length))) # way 5; 2.27 seconds

ということで、勝者は ''.join(choice(chars) for _ in xrange(length)) .

どのように解決するのですか?

この場合 secrets モジュール を使って暗号的に安全なパスワードを生成する必要があります。これは Python 3.6 から利用可能です。ドキュメントから引用しています。

import secrets
import string
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(20))  # for a 20-character password

レシピとベストプラクティスの詳細については Python ドキュメントのレシピに関するこのセクションを参照してください。 . また string.punctuation あるいは、単に string.printable を使うこともできます。