コンテンツへスキップ
uencoder

暗号学的に安全なセッション鍵を生成する

セッション鍵は予測不可能で、セッションごとに一意でなければなりません。CSPRNG による生成と、HKDF によるサブ鍵の導出を学びましょう。

  1. 1

    セッション鍵は、単一セッションのために生成される新しい共通鍵です。CSPRNG(暗号論的に安全な疑似乱数生成器)から生成しなければなりません。Math.random() は絶対に使わないでください。TLS ではセッション鍵は ECDHE で導出されます。アプリケーションレベルでは 256 ランダムビットを生成します。

  2. 2
    ランダムバイトジェネレーター →

    32 バイト(256 ビット)の暗号論的に安全なランダムデータを生成します。これがセッション鍵です。Web Crypto API(crypto.getRandomValues)または Node.js の crypto.randomBytes を使ってください。Math.random() や Date.now() は決して使わないでください。

  3. 3
    HMAC ジェネレーター →

    マスターセッション鍵から HKDF(HMAC ベースの鍵導出関数)でサブ鍵を導出します。例えば、暗号化と MAC に別々の鍵を導出します:K_enc = HKDF(master, "encryption")、K_mac = HKDF(master, "mac")。

  4. 4
    AES 暗号化ツール →

    導出した暗号化鍵でセッションデータを保護します。鍵はセッション中のみメモリ上に存在し、ログアウトやセッションタイムアウトでゼロ化されます。

  5. 5

    前方秘匿性のために、セッションごとに新しい一時鍵ペアを生成し、Diffie-Hellman で公開鍵を交換し、共有秘密からセッション鍵を導出します。一時鍵はセッション後に破棄してください。長期鍵が漏えても、過去のセッションは復号できません。

よくある質問

なぜ Math.random() を使ってはいけないのですか?
Math.random() は暗号論的に安全ではありません。十分な観測があれば出力が予測可能です。逆解析できる PRNG(CSPRNG ではない)を使っています。常に crypto.getRandomValues()(ブラウザ)または crypto.randomBytes()(Node.js)を使ってください。
HKDF とは何ですか?なぜ使うのですか?
HKDF(RFC 5869)は、HMAC を使ってマスター鍵を複数の独立したサブ鍵に展開します。1 つのサブ鍵が漏えても他に影響しないことを保証します。単一のマスター鍵から、暗号化、認証、IV 生成用の別々の鍵を導出するのに使ってください。

このタスクを解決するワークフロー

関連ツール