Python Secrets
以下のようなシステムを作りたいとする
![](https://assets.st-note.com/img/1723725777768-hneVzmGr84.png?width=1200)
![](https://assets.st-note.com/img/1723725858498-gWeeTmk0SG.png)
実装コード
import secrets
import string
import hashlib
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class PasswordGenerator:
"""
パスワード、PIN、トークンを生成するクラス
"""
def __init__(self):
self.lowercase = string.ascii_lowercase
self.uppercase = string.ascii_uppercase
self.digits = string.digits
self.punctuation = string.punctuation
def generate_password(self, length=12, use_uppercase=True, use_digits=True, use_punctuation=False):
"""
パスワードを生成する
:param length: パスワードの長さ
:param use_uppercase: 大文字を使用するかどうか
:param use_digits: 数字を使用するかどうか
:param use_punctuation: 記号を使用するかどうか
:return: 生成されたパスワード
"""
characters = self.lowercase
if use_uppercase:
characters += self.uppercase
if use_digits:
characters += self.digits
if use_punctuation:
characters += self.punctuation
while True:
password = ''.join(secrets.choice(characters) for _ in range(length))
if (len(password) >= length and
(not use_uppercase or any(c.isupper() for c in password)) and
(not use_digits or any(c.isdigit() for c in password)) and
(not use_punctuation or any(c in self.punctuation for c in password))):
return password
def hash_password(password):
"""
パスワードをSHA-256でハッシュ化する
:param password: 生パスワード
:return: ハッシュ化されたパスワード
"""
return hashlib.sha256(password.encode()).hexdigest()
def save_to_database(username, email, hashed_password):
"""
データベースにユーザー情報を保存する(擬似的な実装)
:param username: ユーザー名
:param email: メールアドレス
:param hashed_password: ハッシュ化されたパスワード
"""
# 実際には、データベース接続とSQL文で保存する処理が必要
print(f"Saving to database: Username={username}, Email={email}, HashedPassword={hashed_password}")
def send_email(to_email, subject, body):
"""
ユーザーにメールを送信する(擬似的な実装)
:param to_email: 送信先のメールアドレス
:param subject: メールの件名
:param body: メールの本文
"""
# メールサーバーの設定
from_email = "your_email@example.com"
password = "your_email_password"
# メールの作成
msg = MIMEMultipart()
msg['From'] = from_email
msg['To'] = to_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
# メールの送信(擬似的なサンプル、実際の使用にはセキュアな方法を利用)
try:
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()
server.login(from_email, password)
text = msg.as_string()
server.sendmail(from_email, to_email, text)
server.quit()
print(f"Email sent to {to_email}")
except Exception as e:
print(f"Failed to send email: {e}")
# ユーザーからの入力を受け取る(例: ユーザー名、メールアドレスなど)
user_input = {
"username": "fuji",
"email": "fuji@example.com"
}
# パスワードを生成する
pg = PasswordGenerator()
generated_password = pg.generate_password(length=12, use_punctuation=True)
# 生成されたパスワードをハッシュ化して保存
hashed_password = hash_password(generated_password)
save_to_database(user_input['username'], user_input['email'], hashed_password)
# 生成されたパスワードをユーザーにメールで送信
send_email(user_input['email'], "Your new account password", f"Your password is: {generated_password}")
# 登録完了メッセージを表示
print("User registration completed successfully.")
主要ライブラリー解説
1. string モジュール
ライブラリーの概要
string モジュールは、文字列操作に役立つ様々な定数や関数を提供するPythonの標準ライブラリです。アルファベット、数字、記号などの文字セットがあらかじめ定義されており、文字列の操作や処理を簡単に行うことができます。
活用場面/活用事例
パスワード生成: アルファベットや数字の組み合わせを使ったランダムなパスワードの生成。
データクレンジング: テキストから特定の文字や文字列を抽出したり、削除したりする場合に使用。
テンプレートエンジン: 文字列のフォーマットや置換を行うテンプレートエンジンでの使用。
ライブラリーでよく使われるメソッドや定数
string.ascii_lowercase: 小文字のアルファベット ('abcdefghijklmnopqrstuvwxyz')
string.ascii_uppercase: 大文字のアルファベット ('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
string.digits: 数字 ('0123456789')
string.punctuation: 句読点や特殊文字 ('!"#$%&\'()*+,-./:;<=>?@[\\]^_{|}~'`)
string.whitespace: ホワイトスペース文字 (' \t\n\r\x0b\x0c')
こんなときに活用しよう!
特定の文字セット(アルファベット、数字、記号など)が必要な時
文字列の変換や操作を行う時
テンプレート文字列を使用する時
文字列の検証や整形を行う時
例えばこんなコードはstringモジュールを使うことで簡単に実装できる
stringを使わずに実装したコード:
def generate_password(length):
import random
characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+'
password = ''
for _ in range(length):
password += random.choice(characters)
return password
print(generate_password(12))
stringを使ったコード:
import string
import random
def generate_password(length):
characters = string.ascii_letters + string.digits + string.punctuation
return ''.join(random.choice(characters) for _ in range(length))
print(generate_password(12))
string モジュールを使用することで、コードがより簡潔になり、可読性が向上します。また、string.ascii_letters、string.digits、string.punctuation などの定数を使用することで、文字セットの定義が明確になり、間違いを減らすことができます。さらに、これらの定数を組み合わせることで、必要な文字セットを柔軟に作成できます。
2. hashlib モジュール
ライブラリーの概要
hashlib モジュールは、様々なハッシュアルゴリズム(SHA-256, SHA-512, MD5など)を提供し、データのハッシュ化(チェックサム計算)を行うためのPythonの標準ライブラリです。ハッシュ化は、データの整合性を検証したり、パスワードを安全に保存したりする際に利用されます。
活用場面/活用事例
パスワードのハッシュ化: パスワードを安全に保存するために、ハッシュ化してデータベースに保存する。
データ整合性の検証: ファイルのハッシュを計算し、ダウンロードしたファイルが改ざんされていないか確認する。
デジタル署名: メッセージやデータのハッシュを計算し、デジタル署名の作成や検証に使用。
ライブラリーでよく使われるメソッドや関数
hashlib.sha256(): SHA-256ハッシュアルゴリズムのコンストラクタ。
hashlib.md5(): MD5ハッシュアルゴリズムのコンストラクタ。
hashlib.sha512(): SHA-512ハッシュアルゴリズムのコンストラクタ。
hash_obj.update(data): ハッシュオブジェクトにデータを追加し、ハッシュ値を更新する。
hash_obj.hexdigest(): ハッシュ値を16進数形式で取得する。
3. secrets モジュール
ライブラリーの概要
secrets モジュールは、暗号学的に安全な乱数生成を行うためのPythonの標準ライブラリです。secrets は予測が困難な乱数を生成するため、パスワード生成やトークン生成、セキュリティに関連する用途で推奨されます。
活用場面/活用事例
パスワード生成: ランダムで強力なパスワードを生成する際に利用。
トークン生成: セッションIDやAPIキーなど、セキュリティが求められるトークンの生成。
認証コード生成: 多要素認証で使用する一時的な認証コードの生成。
ライブラリーでよく使われるメソッドや関数
secrets.choice(sequence): シーケンスからランダムに一つの要素を選択する。
secrets.randbelow(n): 0からn-1までのランダムな整数を生成する。
secrets.token_bytes(nbytes=32): nバイトのランダムなバイト列を生成する。
secrets.token_hex(nbytes=32): nバイトのランダムな16進数文字列を生成する。
secrets.token_urlsafe(nbytes=32): URLに安全なランダムな文字列を生成する。
これらのモジュールを使いこなすことで、セキュリティの高いアプリケーションを構築することが可能になります。それぞれのモジュールがどのような場面で活用されるかを理解しておくと、実際の開発に役立てやすいでしょう。