HMAC Generator
SHA-256、SHA-384、またはSHA-512でHMAC署名を生成
メッセージ
シークレットキー
HMAC署名
HMAC署名がここに表示されます…
HMACとは何か
HMAC(Hash-based Message Authentication Code)は、RFC 2104で定義された暗号学的構造であり、ハッシュ関数とシークレットキーを組み合わせて固定長の認証タグを生成します。誰でも計算できる単純なハッシュとは異なり、HMACはシークレットキーを共有する当事者のみが生成・検証できます。HMACはメッセージの完全性と正真性の両方を検証する標準的な仕組みであり、データが改ざんされておらず、信頼できる送信者から送られたことを確認します。
HMACアルゴリズムはあらゆる反復ハッシュ関数と組み合わせて使用できます:SHA-256、SHA-384、SHA-512、さらにはSHA-1やMD5のような古い関数にも対応しています。生成された構造は基底ハッシュの名前で呼ばれ、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512となります。HMACのセキュリティ証明がハッシュ関数の衝突耐性と疑似乱数特性に依存するため、新しいシステムにはSHA-2ファミリーが推奨されます。HMAC-SHA256は最も広く使われており、AWS Signature V4、Stripeウェブフック、GitHubウェブフックシークレット、Slackリクエスト署名、JSON Web Tokens(HS256)で採用されています。
HMACの設計は、単純なハッシュが持たない重要な特性を提供します:長さ拡張攻撃への耐性です。SHA-256単体では、H(message)を知る攻撃者は元のメッセージを知らなくてもH(message || attacker_data)を計算できます。HMACの二重ハッシュ構造(異なるパディング済みキーを使った内側ハッシュと外側ハッシュ)はこの攻撃を完全に防ぎます。これがAPIの署名スキームで、メッセージにシークレットキーを付加してハッシュする代わりにHMACが使われる理由です。
オンラインHMACジェネレーターを使う理由
HMAC署名の計算には通常コードの記述やCLIツールが必要です。このブラウザベースのHMACジェネレーターを使えば、ソフトウェアをインストールしたりターミナルに切り替えたりすることなく、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512の署名を即座に生成できます。
HMACジェネレーターのユースケース
HMAC vs 単純ハッシュ vs 暗号化
HMAC、単純ハッシュ、暗号化はそれぞれ異なる目的に使われます。HMACはメッセージ認証を提供します — シークレットキーを持つ者がメッセージを作成し、改ざんされていないことの証明です。単純ハッシュは完全性を提供しますが認証はできません。暗号化は機密性を提供します。以下の表でその違いを整理します。
| 特性 | HMAC | Plain Hash | Encryption |
|---|---|---|---|
| Purpose | Message authentication + integrity | Data integrity only (no key) | Confidentiality + integrity |
| Requires secret key | Yes | No | Yes |
| Verifiable by | Parties who share the secret | Anyone | Recipient with key |
| Reversible | No — digest only | No — digest only | Yes — decryption recovers data |
| Output size | Depends on hash (e.g. 256 bits) | Depends on hash | Variable (ciphertext) |
| Standard | RFC 2104 | FIPS 180-4 | NIST SP 800-38A (AES) |
| Use case example | Webhook signature verification | File checksum verification | Encrypting data at rest |
HMACアルゴリズム比較
HMACはあらゆるハッシュ関数を使用できますが、基底アルゴリズムの選択によって出力サイズ、セキュリティレベル、ブラウザ互換性が決まります。HMAC-SHA256は新しいシステムで最も一般的な選択肢です。以下の表は代表的なバリアントを比較したものです。
| アルゴリズム | ダイジェストサイズ | 16進数の長さ | Web Crypto API | 主な用途 |
|---|---|---|---|---|
| HMAC-SHA256 | 256 bits | 64 hex chars | Yes | API signing, webhooks, JWT (HS256) |
| HMAC-SHA384 | 384 bits | 96 hex chars | Yes | TLS 1.3 PRF, CNSA compliance |
| HMAC-SHA512 | 512 bits | 128 hex chars | Yes | High-security signatures, HKDF |
| HMAC-SHA1 | 160 bits | 40 hex chars | Yes | Legacy OAuth 1.0, TOTP (RFC 6238) |
| HMAC-MD5 | 128 bits | 32 hex chars | No | Legacy only — not recommended |
HMACの内部動作
HMACは基底ハッシュ関数を、異なるキー派生パッドを使って2回適用します。この構造はRFC 2104で定義されており、標準的な暗号学的仮定のもとでPRF(疑似乱数関数)であることが証明されています。キーはまず、ハッシュ関数のブロックサイズ(SHA-256では64バイト、SHA-512では128バイト)に合わせてパディングまたはハッシュ化されます。
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
アルゴリズムはパディング済みキーを内側パッド定数(ipad、0x36の繰り返し)とXORし、メッセージと連結してハッシュ化します。次にパディング済みキーを外側パッド定数(opad、0x5Cの繰り返し)とXORし、内側ハッシュの出力と連結して再度ハッシュ化します。この二重ハッシュ構造が長さ拡張攻撃を防ぎ、シークレットキーを知らなければHMAC出力を計算できないことを保証します。
HMACコードサンプル
HMACはすべての主要な言語とランタイムでネイティブにサポートされています。Web Crypto APIはライブラリなしでブラウザ上でHMAC-SHA256、HMAC-SHA384、HMAC-SHA512を提供します。以下のサンプルはウェブフック検証や定数時間比較を含む実際の使用パターンを示しています。
async function hmacSHA256(message, secret) {
const enc = new TextEncoder()
const key = await crypto.subtle.importKey(
'raw', enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' },
false, ['sign']
)
const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
return Array.from(new Uint8Array(sig))
.map(b => b.toString(16).padStart(2, '0')).join('')
}
await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
.update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"import hmac
import hashlib
# HMAC-SHA256
sig = hmac.new(
b'my-secret-key',
b'hello world',
hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
print("Signature valid")
# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()package main
import (
"crypto/hmac"
"crypto/sha256"
"fmt"
)
func main() {
mac := hmac.New(sha256.New, []byte("my-secret-key"))
mac.Write([]byte("hello world"))
sig := mac.Sum(nil)
fmt.Printf("%x\n", sig)
// → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad
// Verify: use hmac.Equal for constant-time comparison
expected := mac.Sum(nil)
fmt.Println(hmac.Equal(sig, expected)) // true
}# HMAC-SHA256 echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key" # → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad # HMAC-SHA512 echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key" # Verify a file signature openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz # HMAC with hex key (e.g. from a webhook secret) echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"