piapia123
ja

Cookie の署名と検証

エンコード

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

署名付き Cookie が守るのは改ざんであり盗聴ではありません。値はブラウザー内で平文のままですが、鍵を知るサーバーだけが一致する HMAC を作れます。出力は Express `cookie-signature` の `s:<base64url(値)>.<base64url(HMAC)>` で、HMAC の入力は元の値(UTF-8 バイト)です。検証は選択したアルゴリズムで試し、失敗すると残り 3 つも試して、一致すれば「アルゴリズムの選択違い」と教えます。比較は定数の逐次バイト比較で短絡しません。計算はすべてローカルで、鍵は送信しません。

機能

  • HMAC は 4 種類:SHA-256 / SHA-384 / SHA-512 / SHA-1
  • Express `cookie-signature` の `s:` 形式で出力
  • `openssl dgst -hmac` と照合できる 16 進署名も表示
  • 検証は「形式」「鍵・値」「アルゴリズム」の 3 つの原因を区別
  • アルゴリズム違いのときは実際に使われたものを明示
  • タイミング側信道を避ける定数の逐次バイト比較
  • 空の鍵は拒否し、もっともらしい偽署名を出しません
  • 1 行ずつコピーすることも、すべてコピーすることもできます

使い方

  1. 「署名」または「検証」を選びます
  2. 鍵を入力し、アルゴリズムを選びます
  3. 署名では Cookie の値、検証では `s:...` 全体を入力します
  4. 結果と内訳、openssl の対応コマンドがすぐ表示されます

よくある質問

署名すると Cookie の中身は隠れますか?
いいえ。署名は「改変されていない」ことだけを保証し、値は平文のまま利用者や中間者から読めます。機密性には HTTPS が必要で、秘密を直接 Cookie に入れるべきではありません。署名が防ぐのは user=alice を user=admin に書き換えるような偽造です。
なぜ `===` で署名を比較してはいけないのですか?
`===` は最初の異なるバイトで返るため、先頭数バイトを当てた場合だけわずかに遅くなります。攻撃者は多数のリクエストでその差を平均化し、1 バイトずつ署名を復元できます。そのため本ツールは全バイトを XOR で累積し短絡しません。
鍵はどう保管すべきですか?
鍵はこの方式の安全性そのものです。サーバー側だけに置き、十分長くランダムにしてください。フロントエンドに含めたり Cookie と一緒に送ったりしないこと。本ツールは入力した鍵を保存しませんが、Web ページであることに変わりはありません —— 本番の鍵は自分のマシンのコマンドで扱ってください。

関連ツール