今回は、Pythonのsecretsモジュールを用いて暗号学的に強い乱数によるパスワードの作成方法について解説していきます。
乱数といえばrandomモジュールが思い浮かびますが、パスワードの生成には向いておらず、モデリングやシミュレーションによく使われます。
しかし、初心者向けの内容として暗号を作成する方法も過去に解説していますのでよろしければ参考にしてみてください。
無料オンライン相談を活用しよう!
Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。
その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。
乱数の生成
secretsモジュールを用いた乱数の生成方法は3つあります。
import secrets
print(secrets.randbelow(5))
# 0 <= x < 5のランダムな整数を返す
print(secrets.randbits(5))
# ランダムな5bitの整数を返す(0 <= x <= 2^5 - 1)
print(secrets.choice([i for i in range(5)]))
# 空でないシーケンスから要素をランダムに選択されたものを返すいろいろな使い方ができますね!
乱数を用いたパスワードの生成
先ほどの乱数の生成方法と、「chr」関数を使うことで暗号学的に強いパスワードを作成することができます。
import secrets
password = ""
# passwordの文字列の長さ
length = secrets.choice(range(7, 15))
for _ in range(length):
# ASCIIコードの番号を48 <= x < 122と設定
id = secrets.choice(range(48, 122))
password += chr(id)
print(password)
# ex) N]Wbvc=このパスワード生成方法では、ASCIIコードに対応する番号を設定し、その範囲内でランダムに選ばれた数字をもとに文字列を生成します。
しかし、大文字と小文字のアルファベットに加え、数字に対応するASCIIコードの番号を48~122と直接記述するのはプログラム的にわかりずらいです。
そこで、「string」モジュールを用いてもっとわかりやすく記述してみましょう。
stringモジュールを用いたパスワード生成
stringモジュールはパスワードを生成する際にとても便利です。各関数の返り値と実際の生成方法を解説していきます。
import secrets
import string
def get_pass():
# passwordの文字列の長さ
length = secrets.choice(range(7, 15))
# 英数文字列(大文字含む)、記号から選択
chars = string.ascii_letters + string.digits + string.punctuation
password = "".join([secrets.choice(chars) for _ in range(length)])
return password
if __name__ == '__main__':
print(string.ascii_letters)
# abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)
# 0123456789
print(string.punctuation)
# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print("password ->", get_pass())
# ex) password -> SL]p7Y:V4=7s97stringモジュールもかなり便利ですね!
条件付きパスワードの生成方法
- 10文字のパスワード
- アルファべットと数字からなるパスワード
- 大文字、小文字を少なくとも1つずつ含む
- 数字を少なくとも3つ含む
という条件でパスワードを作成するコードの例です。
import string
import secrets
def get_pass():
chars = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(chars) for i in range(10))
# 小文字が一つでもあればTrue
if (any(c.islower() for c in password)
# 大文字が一つでもあればTrue
and any(c.isupper() for c in password)
# 数字が3つ以上でTrue
and sum(c.isdigit() for c in password) >= 3):
return password
if __name__ == '__main__':
print("password ->", get_pass())
# ex) password -> Y4jRa64y7Vそこまで難しくないですね!
まとめ
最後まで読んでいただきありがとうございます!
今回は、secretsモジュールやstringモジュールを用いて暗号的に強いパスワードを生成する方法を解説しました。
ぜひ少しでも参考になれば嬉しいです。過去には初心者向けにrandomモジュールを使った暗号(パスワード)の作成方法についても解説していますのでこちらも参考にしてみてください。
無料の説明会を有効活用しよう!
独学での学習は孤独感を感じやすく挫折してしまう初心者も多いです。また、参考書を購入しても全く読む気にならないという方も多いはずです。
それでも、なんとかPythonの勉強を行い、高スキルなエンジニアを目指したいという方は無料で受けられるオンライン説明会に参加してみることも一つの手です。
Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。
その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。
参考にしたドキュメント
ナノトイラボ 
