Pythonを使ってランダムなパスワードを生成する

python任意の長さのパスワードを生成しようと思います。まずは必要なモジュールをインポート。

import randam
import string

randam.choiceは文字列、リスト、タプルを引数に取って中の文字を一つ返します。

a = ''
a.join(ramdom.choice('abcdefg'))
print(a)

上のスクリプトを実行したら「e」が出てきました。実行するたびに出力は変わります。リストの場合は以下のように指定します。辞書にある文字を組み合わせてパスワードを作る場合にはリストを使うこともあるかも。

a = ''
a.join(ramdom.choice(['a', 'b', 'c', 'd']))
print(a)

これを実行してみたら「b」が出力されました。randomの挙動が何となくわかったかと思います。

で、アルファベットをいちいち打ち込むのは愚の骨頂なのでstringモジュールを使います。stringモジュールには数字、文字、特殊文字の一覧を取得することができます。アルファベット全般ならstring.ascii_letters、小文字ならstring.ascii_lowercase、数字ならstring.digitsに格納されています。

print(string.ascii_letters)
print(string.digits)

上は「'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'」下は「'0123456789'」が出力されます。

これをrandomの引数に指定することで適当なパスワード候補を作ります。

import random
import string

password = ''.join([random.choice(string.ascii_letters + string.digits) for i in range(8)])

これを実行すると8文字の乱雑なパスワードが出来ました。ここまで書いといて何なんですが、これは暗号学的に強い乱数を使っていないのでrandom部分の見直しを行います。

9.6. random — 擬似乱数を生成する — Python 3.7.0b3 ドキュメント

実は公式ドキュメントにも使うなと書いてあります。

secretモジュールを使用する

ここまでの流れが分かってれば一部書き換えるだけでOK。

import secrets
import string

password = ''.join([secrets.choice(string.ascii_letters + string.digits) for i in range(8)])

これで暗号学的に強い乱数を使ったパスワードができました。見た目は変わらないですけどね。


スポンサード リンク