暗号学的に安全なセッション鍵を生成する
セッション鍵は予測不可能で、セッションごとに一意でなければなりません。CSPRNG による生成と、HKDF によるサブ鍵の導出を学びましょう。
- 1
セッション鍵は、単一セッションのために生成される新しい共通鍵です。CSPRNG(暗号論的に安全な疑似乱数生成器)から生成しなければなりません。Math.random() は絶対に使わないでください。TLS ではセッション鍵は ECDHE で導出されます。アプリケーションレベルでは 256 ランダムビットを生成します。
- 2 ランダムバイトジェネレーター →
32 バイト(256 ビット)の暗号論的に安全なランダムデータを生成します。これがセッション鍵です。Web Crypto API(crypto.getRandomValues)または Node.js の crypto.randomBytes を使ってください。Math.random() や Date.now() は決して使わないでください。
- 3 HMAC ジェネレーター →
マスターセッション鍵から HKDF(HMAC ベースの鍵導出関数)でサブ鍵を導出します。例えば、暗号化と MAC に別々の鍵を導出します:K_enc = HKDF(master, "encryption")、K_mac = HKDF(master, "mac")。
- 4 AES 暗号化ツール →
導出した暗号化鍵でセッションデータを保護します。鍵はセッション中のみメモリ上に存在し、ログアウトやセッションタイムアウトでゼロ化されます。
- 5
前方秘匿性のために、セッションごとに新しい一時鍵ペアを生成し、Diffie-Hellman で公開鍵を交換し、共有秘密からセッション鍵を導出します。一時鍵はセッション後に破棄してください。長期鍵が漏えても、過去のセッションは復号できません。
よくある質問
- なぜ Math.random() を使ってはいけないのですか?
- Math.random() は暗号論的に安全ではありません。十分な観測があれば出力が予測可能です。逆解析できる PRNG(CSPRNG ではない)を使っています。常に crypto.getRandomValues()(ブラウザ)または crypto.randomBytes()(Node.js)を使ってください。
- HKDF とは何ですか?なぜ使うのですか?
- HKDF(RFC 5869)は、HMAC を使ってマスター鍵を複数の独立したサブ鍵に展開します。1 つのサブ鍵が漏えても他に影響しないことを保証します。単一のマスター鍵から、暗号化、認証、IV 生成用の別々の鍵を導出するのに使ってください。
このタスクを解決するワークフロー
関連ツール
ランダムバイトジェネレーター
Generate cryptographically secure random bytes or integers。無料、プライベート、100%クライアントサイド。 ツール
HMAC ジェネレーター
Generate HMAC (Keyed-Hash Message Authentication Code) with SHA-1/256/512。無料、プライベート、100%クライアントサイド。 ツール
AES 暗号化ツール
Encrypt text or binary data with AES (CBC/GCM/ECB) using Web Crypto API。無料、プライベート、100%クライアントサイド。 ツール