前置き
以前random関数を使って、Password Generatorを作成した。今日はsecrets, 機密を扱うために安全な乱数を生成して、パスワードを作成するプログラムコードを紹介したい。
引用元:https://docs.python.org/ja/3/library/secrets.html#module-secrets
パスワードは一般的に英大小文字+数字+記号で10桁以上が安全だといわれています。
引用元:https://www.lrm.jp/security_magazine/secure_password/
まずは、記号、英文字、数字を含めた12文字のパスワードを生成してみる。
プログラムコード
import secrets
import string
def generate_password(length=12):
alphabet = string.ascii_letters + string.digits + string.punctuation
secure_password = ''.join(secrets.choice(alphabet) for i in range(length))
return secure_password
# パスワードを生成して表示する例
generated_password = generate_password()
print("生成されたパスワード:", generated_password)
出力結果
生成されたパスワード: %k=#F!>6uOHq
生成されたパスワード: pX9*s^~<(}g#
生成されたパスワード: j4Z!u@TOj{qo
生成されたパスワード: 0<?8*k^iexu4
生成されたパスワード: :d^5Zh@<]_B+
パスワードを一方的に12文字と設定し、ランダムに生成するのもどうかなと思った。
そこで、ユーザーにパスワードの文字数を選ばせ、パスワードを生成するプログラムコードに改良した。
改良したプログラムコード
import secrets
import string
def generate_password(length):
alphabet = string.ascii_letters + string.digits + string.punctuation
secure_password = ''.join(secrets.choice(alphabet) for _ in range(length))
return secure_password
def main():
try:
length = int(input("生成するパスワードの文字数を入力してください: "))
if length <= 0:
print("無効な文字数です。正の整数を入力してください。")
return
password = generate_password(length)
print("生成されたパスワード:", password)
except ValueError:
print("無効な入力です。整数を入力してください。")
if __name__ == "__main__":
main()
オリジナルコードとの相違点
- 文字数の指定:
前のコード: 固定の長さ(デフォルトで12文字)のパスワードを生成していました。
今回のコード: ユーザーに対して文字数を入力してもらい、その長さに応じてパスワードを生成します。 - エラーハンドリングの改善:
今回のコード: ユーザーが整数以外の入力や負の数を入力した場合にエラーメッセージを表示しています。これにより、プログラムの安全性と使いやすさが向上しています。 - 関数化の強化:
今回のコード: generate_password 関数と main 関数に処理を分割し、コードの構造化と再利用性を高めています。これにより、パスワード生成のロジックとユーザーインターフェースが明確に分離されています。 - 機能追加:
今回のコード: ユーザーに対して文字数を選択させる機能が追加されており、より柔軟にパスワード生成が可能です。
ここでは、5,8,10,12,15,20,30文字のパスワードを出力した結果を含めます。
出力結果
生成するパスワードの文字数を入力してください: 5
生成されたパスワード: VM%'u
生成するパスワードの文字数を入力してください: 8
生成されたパスワード: n.-pI_+t
生成するパスワードの文字数を入力してください: 10
生成されたパスワード: *?W/*UV'ZX
生成するパスワードの文字数を入力してください: 12
生成されたパスワード: g!g:+MIGqm`Q
生成するパスワードの文字数を入力してください: 15
生成されたパスワード: m70@-S1[aKw!X@4
生成するパスワードの文字数を入力してください: 20
生成されたパスワード: uTRrb>|(cbTizj2lkK3M
生成するパスワードの文字数を入力してください: 30
生成されたパスワード: MT.ZhQtIT=eW.r60@4}+`PA(IgVX'!
このように、ちゃんとユーザーが指定した文字数通りにパスワードが生成されている。
また、安全性の観点から英文字、記号、数字の順番がランダムに混ざっている。
皆さんもこのプログラムコードを参考にして、いろんなサイトで使用するパスワードを、生成してみてはいかがでしょうか。