Python 暗号化

secrets モジュール

secrets モジュールは、暗号学的に安全なランダム値を生成するためのツールを提供します。これは、パスワード生成やトークン生成など、セキュリティが重要な場面でのランダム値生成に使用されます。

11.1 基本的な使用方法

例:トークンの生成

import secrets

# 16バイトのランダムなトークンを生成
token = secrets.token_bytes(16)
print(token)

# URLセーフなランダムトークンを生成
url_token = secrets.token_urlsafe(16)
print(url_token)

# 16桁のランダムな16進数トークンを生成
hex_token = secrets.token_hex(16)
print(hex_token)

11.2 暗号学的に安全なランダム値の生成

例:ランダムな整数の生成

import secrets

# 0から9までのランダムな整数を生成
rand_int = secrets.randbelow(10)
print(rand_int)

例:安全なランダムな文字列の生成

import secrets
import string

# 文字列のプール
alphabet = string.ascii_letters + string.digits

# 16文字のランダムな文字列を生成
random_string = ''.join(secrets.choice(alphabet) for i in range(16))
print(random_string)

secrets モジュールの活用場面

1. パスワードの生成

シナリオ: ウェブアプリケーションのユーザーが新しいアカウントを作成する際、安全な初期パスワードを生成する必要があります。

import secrets
import string

def generate_secure_password(length=12):
    alphabet = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(secrets.choice(alphabet) for i in range(length))
    return password

# 初期パスワードの生成
new_password = generate_secure_password()
print(f"新しい初期パスワード: {new_password}")

なぜ使用するのか

secrets モジュールは暗号学的に安全なランダム値を生成するため、予測不可能なパスワードを作成できます。これにより、初期パスワードが推測されにくくなります。

2. API トークンの生成

シナリオ

ウェブサービスがユーザーにAPIトークンを発行し、APIアクセスの認証に使用する場合。

import secrets

def generate_api_token():
    return secrets.token_urlsafe(32)

# APIトークンの生成
api_token = generate_api_token()
print(f"生成されたAPIトークン: {api_token}")

hashlib モジュール

hashlib モジュールは、ハッシュ関数(メッセージダイジェストアルゴリズム)を提供します。これは、データのハッシュ値を計算するために使用されます。

12.1 基本的な使用方法

例:SHA-256 ハッシュの計算

import hashlib

# ハッシュ化するデータ
data = "Hello, world!".encode()

# SHA-256 ハッシュオブジェクトの作成
hash_object = hashlib.sha256(data)

# ハッシュ値を16進数形式で取得
hex_dig = hash_object.hexdigest()
print(hex_dig)

12.2 その他のハッシュアルゴリズム

hashlib モジュールは、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、MD5などの複数のハッシュアルゴリズムをサポートしています。

例:MD5 ハッシュの計算

import hashlib

# ハッシュ化するデータ
data = "Hello, world!".encode()

# MD5 ハッシュオブジェクトの作成
hash_object = hashlib.md5(data)

# ハッシュ値を16進数形式で取得
hex_dig = hash_object.hexdigest()
print(hex_dig)

12.3 ハッシュオブジェクトの使用

ハッシュオブジェクトを使ってデータのハッシュ値を段階的に計算することができます。

例:データのハッシュ値の段階的な計算

import hashlib

# SHA-256 ハッシュオブジェクトの作成
hash_object = hashlib.sha256()

# データを段階的にハッシュ化
hash_object.update("Hello, ".encode())
hash_object.update("world!".encode())

# ハッシュ値を16進数形式で取得
hex_dig = hash_object.hexdigest()
print(hex_dig)

12.4 パスワードのハッシュ化

hashlib モジュールは、パスワードのハッシュ化にも使用されます。パスワードを安全に保存するためには、ソルトを使ってハッシュ化することが推奨されます。

例:ソルトを使ったパスワードのハッシュ化

import hashlib
import os

# ソルトの生成
salt = os.urandom(16)
password = "mypassword".encode()

# パスワードとソルトを結合してハッシュ化
hash_object = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)

# ソルトとハッシュ値を保存
stored_password = salt + hash_object
print(stored_password)

hashlib モジュールの活用場面

1. パスワードのハッシュ化と検証

シナリオ: ウェブアプリケーションでユーザーのパスワードをデータベースに保存する際に、平文ではなくハッシュ化して保存し、ログイン時に検証します。

import hashlib
import os

def hash_password(password):
    salt = os.urandom(16)
    hash_object = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
    return salt + hash_object

def verify_password(stored_password, provided_password):
    salt = stored_password[:16]
    stored_hash = stored_password[16:]
    hash_object = hashlib.pbkdf2_hmac('sha256', provided_password.encode(), salt, 100000)
    return hash_object == stored_hash

# パスワードのハッシュ化
hashed_password = hash_password('mypassword')
print(f"ハッシュ化されたパスワード: {hashed_password}")

# パスワードの検証
is_valid = verify_password(hashed_password, 'mypassword')
print(f"パスワードが一致するか: {is_valid}")

なぜ使用するのか

パスワードをハッシュ化することで、データベースが漏洩しても元のパスワードが推測されにくくなります。また、検証時にはハッシュを比較することで、ユーザーが正しいパスワードを入力したかどうかを確認します。

2. ファイルの整合性チェック

シナリオ

ファイルをダウンロードした後、その内容が改ざんされていないかをチェックするために、ハッシュ値を比較します。

import hashlib

def calculate_file_hash(file_path, algorithm='sha256'):
    hash_object = hashlib.new(algorithm)
    with open(file_path, 'rb') as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_object.update(chunk)
    return hash_object.hexdigest()

# ファイルのハッシュ値の計算
file_hash = calculate_file_hash('example.txt')
print(f"ファイルのハッシュ値: {file_hash}")

# 期待されるハッシュ値と比較
expected_hash = 'expected_hash_value'
is_valid = (file_hash == expected_hash)
print(f"ファイルが改ざんされていないか: {is_valid}")

なぜ使用するのか

ファイルのハッシュ値を計算して保存しておくことで、後でファイルの整合性を確認できます。ダウンロードしたファイルが改ざんされていないことを確認するために役立ちます。

まとめ

secrets: 暗号学的に安全なランダム値を生成するために使用し、安全なパスワードやAPIトークンを生成します。
hashlib: データのハッシュ化を行い、パスワードの安全な保存と検証、ファイルの整合性チェックなどに使用します。

この記事が気に入ったらサポートをしてみませんか?