HMACにはメッセージのほかに鍵が必要
通常のSHA-256はメッセージのバイトをハッシュします。HMAC-SHA-256は鍵とメッセージから認証値を計算します。RFC 2104の構成は鍵をメッセージの先頭に付けてハッシュするだけの方式ではありません。鍵なしハッシュの一致だけでは送信者を認証できません。
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よくある質問
名前にSHA-256があれば結果を比較できますか?
通常のSHA-256とHMAC-SHA-256を混同しないでください。HMACの比較には同じ鍵バイト、メッセージバイト、アルゴリズムが必要です。16進数とBase64などの出力表現も区別してください。