# OpenAI Agent SDKの便利だけど知られていない機能
🌍 エージェントの会話履歴に機密情報が含まれているのに、平文で保存していませんか?
EncryptedSessionを使えば、会話データをFernet暗号化で保護し、TTLによる自動失効も設定できます。
📌 タイトル:暗号化セッション (EncryptedSession)
🔗 URL:
🧩 概要
`EncryptedSession` は、任意のセッションバックエンドを `underlying_session` としてラップし会話データを暗号化するドロップインラッパーです。Fernet暗号化を採用し、HKDF(info 文字列 `"agents.session-store.hkdf.v1"`、salt は session_id)によるセッションごとの鍵導出でセッション間の暗号分離を実現します。`ttl`(既定 600 秒)を超えた項目は取得時に自動的にスキップされます。マスターキーには `Fernet.generate_key()` などの高エントロピーな値を使います(生の文字列も互換性のため受け付けますが、パスワードのような低エントロピーの秘密は不適切です)。
🛠 使い方
```python
import os
from cryptography.fernet import Fernet
from agents import SQLiteSession
from agents.extensions.memory import EncryptedSession
# 基底セッションを暗号化でラップ
base_session = SQLiteSession("chat-001", "sessions.db")
# マスターキーは Fernet.generate_key() などの高エントロピーな値を使う
encryption_key = Fernet.generate_key().decode("ascii")
encrypted = EncryptedSession(
session_id="chat-001",
underlying_session=base_session,
encryption_key=encryption_key,
ttl=3600, # 1時間で失効(既定は 600 秒)
)
# 永続化する場合は同じキーを Secret Manager 等から読み込んで再利用する
encrypted = EncryptedSession(
session_id="chat-001",
underlying_session=base_session,
encryption_key=os.environ["SESSION_ENCRYPTION_KEY"],
ttl=7200,
)
# 通常のセッションと同じインターフェースで利用可能
items = await encrypted.get_items()
```
🏗 本番システムへの組み込み方
・医療・金融など規制業界のコンプライアンス要件に対応する
・HKDFによりセッションごとに異なる暗号鍵が導出されるため、1セッションの漏洩が他に波及しない
・TTLを設定して、一定期間後に復号不能にする「暗号学的データ消去」を実現する
・既存のSQLiteSession / RedisSession等をそのままラップでき、移行コストが極めて低い
💡 ユースケース
🏥 医療情報を含む会話の暗号化保存
🏦 金融データを扱うエージェントのセキュリティ強化
🔐 GDPRの「忘れられる権利」対応(TTL失効)
🛡 マルチテナント環境でのセッション間データ分離
⚠️ 注意点
利用には `pip install 'openai-agents[encrypt]'` で `encrypt` extra をインストールしてください。暗号化されたデータに対しては `find_turns_by_content()` などの内容検索が機能しません。検索が必要な場合は検索用のインデックスを別途管理する必要があります。また、暗号鍵を紛失するとデータが復元不能になるため、鍵の安全な管理(Secret Manager等)が必須です。`encryption_key` を変更しても既存レコードは再暗号化されないため、古いデータの復号には元のキーが必要です。
✨ EncryptedSessionで、会話データの保護をコード1行で実現しましょう。
#
OpenAIAgentSDK# #
AIAgent#