🐥

暗号化ライブラリを使ってみる

2023/06/12に公開

はじめに

現在、LINE Messaging APIとFirebaseを使用してチャットボットを作成しているのですが、whereを利用してあるユーザの情報を持ってきたいと思ったときにユーザ名だと被るかもしれないのでユーザIDで検索をかけようかと考えました。でも、ユーザIDなんて大事な情報をネットの丸裸で流すわけにはいかないので暗号化ライブラリを使用することにしました。

暗号化ライブラリまとめ

Pythonの暗号化ライブラリとそれらの概要を表にまとめました。非常にたくさんのライブラリがあることがわかりました。それぞれのライブラリが得手不得手を持っているためユースケースに応じて適切なライブラリを使用する必要があります。

ライブラリ名 概要
cryptography 高度な暗号化操作を提供するライブラリで、対称鍵暗号化、公開鍵暗号化、ハッシュ関数などの機能を提供します。
PyCryptoDome PyCryptoのフォークで、多くの暗号化アルゴリズムとツールを提供します。対称鍵暗号化、公開鍵暗号化、ハッシュ関数、メッセージ認証コードなどが含まれます。
bcrypt パスワードのハッシュ化と比較に使用されるハッシュ関数で、セキュアなパスワードの保存に適しています。

簡単なサンプルコード

自分の備忘録としてサンプルコードを残したいと思います。

cryptography

from cryptography.fernet import Fernet

# 鍵の生成
key = Fernet.generate_key()

# 鍵を使用してFernetオブジェクトを作成
fernet = Fernet(key)

# メッセージの暗号化
message = b"Hello, World!"
encrypted_message = fernet.encrypt(message)

# 暗号化されたメッセージの表示
print("暗号化されたメッセージ:", encrypted_message)

# メッセージの復号化
decrypted_message = fernet.decrypt(encrypted_message)

# 復号化されたメッセージの表示
print("復号化されたメッセージ:", decrypted_message)

PyCryptoDome

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 鍵の生成
key = get_random_bytes(16)

# IVの生成
iv = get_random_bytes(16)

# 暗号化するデータ
data = b"Hello, World!"

# 暗号化器の作成
cipher = AES.new(key, AES.MODE_CBC, iv)

# データのパディング
block_size = AES.block_size
padding_size = block_size - (len(data) % block_size)
padded_data = data + bytes([padding_size]) * padding_size

# データの暗号化
encrypted_data = cipher.encrypt(padded_data)

# 暗号化されたデータとIVの表示
print("暗号化されたデータ:", encrypted_data)
print("IV:", iv)

# 復号化器の作成
decipher = AES.new(key, AES.MODE_CBC, iv)

# データの復号化
decrypted_data = decipher.decrypt(encrypted_data)

# パディングの削除
padding_size = decrypted_data[-1]
unpadded_data = decrypted_data[:-padding_size]

# 復号化されたデータの表示
print("復号化されたデータ:", unpadded_data)

bcrypt

import bcrypt

# パスワードのハッシュ化
password = b"mypassword"
hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())

# ハッシュ化されたパスワードの表示
print("ハッシュ化されたパスワード:", hashed_password)

# パスワードの検証
input_password = b"mypassword"
if bcrypt.checkpw(input_password, hashed_password):
    print("パスワードは一致しました。")
else:
    print("パスワードは一致しませんでした。")

まとめ

暗号化ライブラリについてまとめました。いろんなライブラリがあって簡単に暗号化を試すことができるようです。でも肝心のユースケースについて知識が乏しいので安易に使うのは避けようと思います。今回のアプリ開発は知人に軽く共有する程度で考えているのでいいけど大勢に提供することを前提にした開発では、技術選定はもっと注意深くしないといけない。

Discussion