HMAC 生成は, 1 つのメッセージを 1 つの秘密鍵で署名し, 鍵付きダイジェストを印字します. 計算全体はブラウザ側の WebCrypto 呼び出しです: メッセージも鍵もページに残り, どのサーバーにも送られず, 結果は決定論的な文字列で, リクエストヘッダ, クエリパラメータ, テストベクトルに貼れます. HMAC 生成から始めて, メッセージに The quick brown fox jumps over the lazy dog, 鍵に key と打ち, SHA-256 と Hex を選んだまま, 生成を押します: ダイジェストは f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 と印字します.
4 つのコントロール
ダイジェストを決めるのは 4 つの入力です: メッセージ欄, Text/Hex 切替付きの鍵欄, アルゴリズム選択, 出力形式選択. メッセージは複数行のテキストエリアです: 改行もメッセージの一部で署名に巻き込まれ, 同じ言葉を 2 行に分けるのとスペースで 1 行に繋ぐのでは値が異なり, 你好 の UTF-8 バイトは鍵 key で 309b75c0cbbfb27bb35b8d7b8f4adb4b9399cd54339ab5faeb8798e1b9f7f00c と署名されます. 鍵は 1 行欄で, 切替がこの文字列の読み方を決めます. アルゴリズム選択は SHA-256, SHA-384, SHA-512 を, 形式選択は Hex と Base64 を提供します. 生成は明示的なボタンです: 押すまで何も計算されず, ダイジェストはコピー付きの読み取り専用欄に現れます.
テキスト鍵と 16 進鍵
Text モードでは鍵は打ったままの UTF-8 バイトとして読まれます: 末尾のスペースも含め全文字が鍵の一部で, 鍵 key が abc を 9c196e32dc0175f86f4b1cb89289d6619de6bee699e4c378e68309ed97a1a6ab と印字するところ, 末尾 1 スペースの key は同じ abc を 0324ef70f9e605e123731b458dcdce99cf5f8d23572f604fbdabf371aedb0f68 と印字します. Hex モードでは文字列はまず全空白を除かれ, その後生のバイト対として読まれるため, 616263 はバイト 0x61, 0x62, 0x63 の 3 バイトで, テキスト 616263 の 6 文字ではありません: メッセージ msg では 16 進鍵 616263 が eb14f17c9f056479f147adcf8020d27914f1e5971f049e75bf21a669cbd747e2 と, テキスト鍵 616263 が 49962d2f0cde29c6a4848f8ea64575424ad42d3d108452127c0512cb88444a41 と印字します. 16 進文字列は 2 文字以上, 偶数長, 全文字 16 進数字でなければなりません; 6162635 は暗号処理の走る前にチェックに落ち, 奇数長や a から f 外の文字も同じチェックに落ちます.
3 つのアルゴリズム
ダイジェストの長さはアルゴリズムで固定です: SHA-256 は 32 バイト, 16 進 64 文字, または = 1 つの padding 付き Base64 44 文字; SHA-384 は 48 バイト, 16 進 96 文字, または padding なし Base64 64 文字; SHA-512 は 64 バイト, 16 進 128 文字, または二重 padding 付き Base64 88 文字. 3 つは同じ鍵付き構造を 3 つのハッシュ関数にかけたもので, 選択を切り替えても変わりるのは長さと言葉だけで, 入力の形は変わりません. このツールは RFC 4231 のテストベクトルを再現します: 16 進鍵 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b とメッセージ Hi There で, SHA-256 は b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7, SHA-512 は 87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854 と印字し, テキスト鍵 Jefe とメッセージ what do ya want for breakfast? では, SHA-256 が 47f69d8f80f0a6326746beec23a9040fd533642b5ba38a99287670639d8b862a と印字します.
Hex と Base64
Hex はバイトごとに小文字で 16 進を印字し, 1 バイト 2 文字; Base64 は同じバイトを標準の padding で印字します. 2 つの表記が持つのは同じ 32 バイトです: 鍵 key の fox メッセージは, Hex で f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8, Base64 で 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg=, 末尾の = は padding で署名された文字ではありません. Jefe メッセージは SHA-256 で R/adj4DwpjJnRr7sI6kED9UzZCtbo4qZKHZwY52Lhio=, SHA-384 で MxTAcsyrQOuSUFsKlh1Gv2UuDowpCJfZzsFDvCo65FGJ15G5QCeCSey3RFF3dIlG と印字します. 48 バイトは Base64 のグループをちょうど埋め, padding が出ません. SHA-512 では af7nmi5sP0zyOeCqttVBl2h4BIXw5B/8dZckor99FGR+CncEsWts5Zi2pWU1HIhhnQ3+0nKMj8+Ja0GvkB1UCA== で, 64 バイトは最後のグループに 1 バイト残し, 二重 = で padding します. コピーボタンは印字された文字列をクリップボードに置き, 2 秒だけ コピー済み と読めます.
決定論と入力チェック
同じメッセージ, 鍵, アルゴリズムは常に同じダイジェストを印字します: 塩もタイムスタンプも乱数もなく, それが HMAC をテストベクトルに, そして 2 つのシステムの共有チェックに使わせる性質です. 2 つの入力が, いかなる暗号処理の前にも拒否されます: 空か空白だけのメッセージはメッセージ入力のエラーを, 空か空白だけの鍵は鍵入力のエラーを上げ, 16 進チェックに落ちた鍵は不正な 16 進のエラーを上げ, 3 つとも欄は内容を保持して修正を待ちます. 鍵の長さはそれ以外には制限がありません: 1 バイト鍵は abc を df55998f9fc33d78ac99d1d8ebc2b6e16aa076c4189946942a82b55d5dee8dc7 と印字し, 100 バイト鍵は同じ abc を 30f0f7f4a3d31b9750666b038c048550020795dd2743759bf83bcf5e0f125b36 と印字します. HMAC 構造は長すぎる鍵をまずハッシュサイズまでハッシュするためです. 残るプラットフォームの角が 1 つ: WebCrypto の subtle API は安全なコンテキストにのみ存在するため, 生の http のページでは, ボタンは計算する代わりに失敗エラーを出します.
何ではないか
HMAC 生成は通常のハッシュツールではありません: 鍵なしでメッセージ自体のダイジェストが要るなら, ハッシュ生成がテキストに MD5, SHA-1, SHA-2 族を走らせます. JWT ツールでもない: トークンを署名するのではなく, 読む, 分割する, Base64 解凍するなら, JWT デコーダがそれをします. 暗号化もしません: ダイジェストは署名で, 秘密の容器ではなく, 暗号化の方向はAES ガイドが扱います. そして 4 つの入力以外の状態を保持しません: 履歴も, 保存された鍵も, 前回のダイジェストの記憶もなく, ページを閉じるとメッセージと鍵は捨てられます.