1
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Pythonで指定した文字数のパスワードを生成するプログラムを作ってみた

Last updated at Posted at 2024-06-29

前置き

以前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()

オリジナルコードとの相違点

  1. 文字数の指定:
    前のコード: 固定の長さ(デフォルトで12文字)のパスワードを生成していました。
    今回のコード: ユーザーに対して文字数を入力してもらい、その長さに応じてパスワードを生成します。
  2. エラーハンドリングの改善:
    今回のコード: ユーザーが整数以外の入力や負の数を入力した場合にエラーメッセージを表示しています。これにより、プログラムの安全性と使いやすさが向上しています。
  3. 関数化の強化:
    今回のコード: generate_password 関数と main 関数に処理を分割し、コードの構造化と再利用性を高めています。これにより、パスワード生成のロジックとユーザーインターフェースが明確に分離されています。
  4. 機能追加:
    今回のコード: ユーザーに対して文字数を選択させる機能が追加されており、より柔軟にパスワード生成が可能です。

ここでは、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'!

このように、ちゃんとユーザーが指定した文字数通りにパスワードが生成されている。
また、安全性の観点から英文字、記号、数字の順番がランダムに混ざっている。

皆さんもこのプログラムコードを参考にして、いろんなサイトで使用するパスワードを、生成してみてはいかがでしょうか。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0