Streamlitを使ってパスワード生成アプリを作成しよう!応用編

IT・プログラミング

前回はStreamlitを使ってパスワード生成アプリを作成しました。
今回は、そこで作成したコードに少し手を加えて機能を追加していきたいと思います。
具体的には、パスワードに含める文字を指定できるようにする機能と、パスワードの強度を表示する機能です。
完成イメージとしては下記の画像のようになるイメージです。

機能追加後

コード全体

import streamlit as st
import random
import string

def generate_password(length, use_uppercase, use_numbers, use_special_chars):
    characters = string.ascii_lowercase
    if use_uppercase:
        characters += string.ascii_uppercase
    if use_numbers:
        characters += string.digits
    if use_special_chars:
        characters += string.punctuation

    password = ''.join(random.choice(characters) for _ in range(length))
    return password

def evaluate_password_strength(password):
    strength = 0

    if any(char.islower() for char in password):
        strength += 1
    if any(char.isupper() for char in password):
        strength += 1
    if any(char.isdigit() for char in password):
        strength += 1
    if any(char in string.punctuation for char in password):
        strength += 1

    if len(password) >= 12 and strength >= 3:
        return "強"
    elif len(password) >= 8 and strength >= 2:
        return "中"
    else:
        return "弱"

st.title("パスワード生成アプリ")

password_length = st.slider("パスワードの長さを選択してください", min_value=6, max_value=20, value=12)
use_uppercase = st.checkbox("大文字を含める")
use_numbers = st.checkbox("数字を含める")
use_special_chars = st.checkbox("特殊文字を含める")

custom_option = st.text_input("カスタムオプション(単語やキーワードを含める場合)")

if st.button("パスワードを生成"):
    if custom_option:
        password = custom_option + generate_password(password_length, use_uppercase, use_numbers, use_special_chars)
    else:
        password = generate_password(password_length, use_uppercase, use_numbers, use_special_chars)

    strength = evaluate_password_strength(password)
    st.success("生成されたパスワード: " + password)
    st.success("パスワードの強度: " + strength)

st.info("セキュリティのために生成されたパスワードは安全に保管してください。")

コードの詳細

今回のパスワード生成アプリは、指定した条件に基づいてランダムなパスワードを生成するものです。

1. 必要なライブラリのインポート

まず、必要なライブラリをインポートします。streamlitは、ウェブアプリケーションを作成するためのライブラリです。また、randomstringはランダムな文字列を生成するために使用します。

import streamlit as st
import random
import string

2. パスワード生成関数の定義

パスワードを生成するための関数を定義します。この関数は、指定された長さと文字種に基づいてランダムなパスワードを生成します。

def generate_password(length, use_uppercase, use_numbers, use_special_chars):
    characters = string.ascii_lowercase
    if use_uppercase:
        characters += string.ascii_uppercase
    if use_numbers:
        characters += string.digits
    if use_special_chars:
        characters += string.punctuation

    password = ''.join(random.choice(characters) for _ in range(length))
    return password

3. StreamlitアプリのUIの作成

カスタムオプションの追加

「カスタムオプション」として、ユーザーがテキスト入力を行う欄を追加しました。このテキスト入力に入力された内容は、生成されたパスワードとして使用されます。これにより、ユーザーが自分自身の意図したパスワードを使用することができます。

custom_option = st.text_input("カスタムオプション(単語やキーワードを含める場合)")

パスワード強度評価の追加

パスワード生成アプリに強度評価機能を追加しましょう。この機能は、生成されたパスワードの強度を評価し、ユーザーに表示します。

1. evaluate_password_strength 関数の定義

evaluate_password_strength 関数は、生成されたパスワードの強度を評価します。以下の条件を満たすと、パスワードの強度が分類されます。

  • 小文字、大文字、数字、特殊文字のうち3つ以上が含まれる場合、強
  • 小文字、大文字、数字のうち2つ以上が含まれる場合、中
  • それ以外の場合、弱
def evaluate_password_strength(password):
    strength = 0

    if any(char.islower() for char in password):
        strength += 1
    if any(char.isupper() for char in password):
        strength += 1
    if any(char.isdigit() for char in password):
        strength += 1
    if any(char in string.punctuation for char in password):
        strength += 1

    if len(password) >= 12 and strength >= 3:
        return "強"
    elif len(password) >= 8 and strength >= 2:
        return "中"
    else:
        return "弱"

2. 強度評価の表示

if st.button("パスワードを生成"): のブロック内に、生成されたパスワードの強度を評価し、表示するコードを追加します。

if st.button("パスワードを生成"):
    if custom_option:
        password = custom_option
    else:
        password = generate_password(password_length, use_uppercase, use_numbers, use_special_chars)

    strength = evaluate_password_strength(password)
    st.success("生成されたパスワード: " + password)
    st.success("パスワードの強度: " + strength)
    st.button("コピー", key="copy_button", on_click=pyperclip.copy(password))

このコードにより、パスワード生成後に生成されたパスワードの強度が表示されます。強度は、「強」「中」「弱」のいずれかで分類され、ユーザーにセキュリティの目安を示します。

今回は前回作成したパスワード生成アプリにカスタム文字列の追加機能と、強度表示機能を追加しました。
カスタム文字列は今回は最初に使われるだけの仕様ですが、ランダムな文字列を前後に入れられるようにさらに改善もできそうですね。
GoogleColabのコード

タイトルとURLをコピーしました