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)])
これで暗号学的に強い乱数を使ったパスワードができました。見た目は変わらないですけどね。