HMACにはメッセージのほかに鍵が必要

通常のSHA-256はメッセージのバイトをハッシュします。HMAC-SHA-256は鍵とメッセージから認証値を計算します。RFC 2104の構成は鍵をメッセージの先頭に付けてハッシュするだけの方式ではありません。鍵なしハッシュの一致だけでは送信者を認証できません。

SHA-256はメッセージ、HMAC-SHA-256は鍵とメッセージを入力する。出力はどちらも256ビット
Mはメッセージ、Kは鍵です。入力構造を説明する自作の概念図です。出力の長さが同じでも値や機能が同じとは限りません。

RFC 2104 §2: HMAC

RFCのテスト鍵をバイトとして再現する

RFC 4231のテスト1は0x0bを20バイトとメッセージHi Thereを使います。以下はWeb CryptoのHMAC鍵をインポートして結果を16進数で表示するコードです。文字列0bを20回繰り返すと40バイトの別の入力になります。公開テスト鍵であり、本番の秘密鍵ではありません。

Moyoutilは通常のSHAハッシュを計算し、HMAC入力欄はありません。以下は別のJavaScript例で、ログインやWebhook検証の完成した実装ではありません。実際の認証には秘密鍵の保護と正しい検証手順が必要です。

const hex = bytes => Array.from(new Uint8Array(bytes),
  n => n.toString(16).padStart(2, '0')).join('');
const keyBytes = new Uint8Array(20).fill(0x0b);
const message = new TextEncoder().encode('Hi There');
const key = await crypto.subtle.importKey(
  'raw', keyBytes, {name:'HMAC', hash:'SHA-256'},
  false, ['sign']);
const mac = await crypto.subtle.sign('HMAC', key, message);
console.log(hex(mac));
// b0344c61d8db38535ca8afceaf0bf12b
// 881dc200c9833da726e9376c2e32cff7

RFC 4231 §4.2: Test Case 1

W3C Web Cryptography: HMAC

よくある質問

名前にSHA-256があれば結果を比較できますか?

通常のSHA-256とHMAC-SHA-256を混同しないでください。HMACの比較には同じ鍵バイト、メッセージバイト、アルゴリズムが必要です。16進数とBase64などの出力表現も区別してください。