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署名がすぐに得られます。Web Crypto APIがブラウザ内でネイティブに計算を処理します。
🔒
プライバシー優先の処理
メッセージとシークレットキーはデバイスの外に送信されません。すべてのHMAC計算はWeb Crypto APIを通じてローカルで実行され、サーバーへのリクエスト、ログ記録、データ保持は一切ありません。
📋
複数アルゴリズム対応
ワンクリックでHMAC-SHA256、HMAC-SHA384、HMAC-SHA512を切り替えられます。アルゴリズム間で出力を比較して、バックエンド実装が一致するか確認できます。
🔍
アカウントもインストールも不要
Chrome、Firefox、Safari、Edgeなどの現代的なブラウザで動作します。サインアップ、拡張機能、CLIのセットアップは不要です。ページを開いてすぐにHMAC署名の生成を始められます。

HMACジェネレーターのユースケース

フロントエンド開発者 — ウェブフック署名の検証
Stripe、GitHub、ShopifyはHMAC-SHA256でウェブフックペイロードに署名します。このツールを使えばペイロードとシークレットから期待される署名を計算し、開発中にHTTPヘッダーの署名と照合できます。
バックエンドエンジニア — APIリクエスト署名
AWS Signature V4は署名プロセスの複数の段階でHMAC-SHA256を必要とします。開発中にHMACの参照値を生成して署名の不一致をデバッグし、中間計算ステップを検証できます。
DevOps — シークレットローテーションの検証
ウェブフックシークレットやAPI署名キーをローテーションする際、古いキーと新しいキーの両方でHMAC署名を計算し、古いキーの期限切れ前にアプリケーションが移行を正しく処理するか確認できます。
QAエンジニア — 署名テストベクター
既知の入力とキーでHMACテストベクターを生成し、認証ミドルウェアのリグレッションテストを構築できます。実装が空のメッセージ、Unicode入力、長いキーを正しく処理するか確認しましょう。
データエンジニア — パイプラインメッセージ認証
イベント駆動パイプライン(Kafka、SQS)のメッセージにHMAC署名を付加して、サービス間の転送中にメッセージが改ざんされていないことを検証できます。
学生 — 暗号学の学習
HMACを試してみることで、メッセージやキーの一文字を変えるだけで署名が全く異なるものになる仕組みを理解できます。HMACの出力と単純なSHA-256の出力を比較して、シークレットキーがもたらす違いを観察しましょう。

HMAC vs 単純ハッシュ vs 暗号化

HMAC、単純ハッシュ、暗号化はそれぞれ異なる目的に使われます。HMACはメッセージ認証を提供します — シークレットキーを持つ者がメッセージを作成し、改ざんされていないことの証明です。単純ハッシュは完全性を提供しますが認証はできません。暗号化は機密性を提供します。以下の表でその違いを整理します。

特性HMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

HMACアルゴリズム比較

HMACはあらゆるハッシュ関数を使用できますが、基底アルゴリズムの選択によって出力サイズ、セキュリティレベル、ブラウザ互換性が決まります。HMAC-SHA256は新しいシステムで最も一般的な選択肢です。以下の表は代表的なバリアントを比較したものです。

アルゴリズムダイジェストサイズ16進数の長さWeb Crypto API主な用途
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

HMACの内部動作

HMACは基底ハッシュ関数を、異なるキー派生パッドを使って2回適用します。この構造はRFC 2104で定義されており、標準的な暗号学的仮定のもとでPRF(疑似乱数関数)であることが証明されています。キーはまず、ハッシュ関数のブロックサイズ(SHA-256では64バイト、SHA-512では128バイト)に合わせてパディングまたはハッシュ化されます。

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
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を提供します。以下のサンプルはウェブフック検証や定数時間比較を含む実際の使用パターンを示しています。

JavaScript (Web Crypto API)
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"
Python
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()
Go
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
}
CLI (OpenSSL)
# 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)"

よくある質問

HMACと単純ハッシュの違いは何ですか?
単純なハッシュ(SHA-256、MD5)はメッセージのみを入力として受け取り、誰でも計算できるダイジェストを生成します。HMACはメッセージとシークレットキーの両方を受け取り、キーを持つ者だけが生成・検証できる署名を生成します。つまりHMACは完全性チェックに加えて認証(送信者の身元証明)を提供します。単純なハッシュはデータが変更されていないことを証明するだけで、誰が作成したかは証明できません。
HMAC-SHA256は安全ですか?
はい。HMAC-SHA256は2026年現在、安全とみなされています。そのセキュリティはSHA-256の疑似乱数特性とHMAC構造自体(RFC 2104)に依存しています。HMAC-SHA256に対する実用的な攻撃は実証されていません。HMAC-MD5やHMAC-SHA1でさえ、HMACのセキュリティは基底ハッシュの完全な衝突耐性を必要としないため、実用上は安全です。ただし新しいシステムにはSHA-2バリアントが推奨されます。
ウェブフックはなぜペイロードを暗号化せずHMACを使うのですか?
ウェブフックペイロードには受信者がすでに想定しているデータが含まれることが多く、注文詳細、イベント通知、ステータス更新などです。目的はデータを隠すこと(機密性)ではなく、正当な送信者から届き、転送中に改ざんされていないことを証明すること(正真性と完全性)です。HMACはこれを最小限のオーバーヘッドで実現します:送信者は共有シークレットを使ってペイロードのHMACを計算し、HTTPヘッダーに含めます。受信者はHMACを再計算して比較します。暗号化は不要な複雑さとキー管理の負担を加えることになります。
HMAC署名を安全に比較するにはどうすればよいですか?
常に定数時間比較関数を使用してください。Pythonではhmac.compare_digest()、Node.jsではcrypto.timingSafeEqual()、Goではhmac.Equal()を使います。通常の文字列等価演算子(==や===)はタイミング情報を漏洩させる可能性があります:攻撃者は比較にかかる時間を測定して、偽造した署名の何バイトが正しいものと一致するかを特定し、残りのバイトを一つずつブルートフォースできます。
HMACを逆算してシークレットキーを復元できますか?
できません。HMACは一方向ハッシュ関数に基づいているため、HMAC出力からキーを抽出する数学的な近道はありません。攻撃者はキー空間をブルートフォースする必要がありますが、128ビット以上のキーでは実現不可能です。ただし、弱いまたは短いキー(単純なパスワードなど)は辞書攻撃に対して脆弱になり得るため、HMAC-SHA256には常に256ビット以上の暗号学的にランダムなキーを使用してください。
HMACキーがハッシュブロックサイズより長い場合はどうなりますか?
シークレットキーがハッシュ関数のブロックサイズ(SHA-256では64バイト、SHA-512では128バイト)より長い場合、HMACアルゴリズムはまず基底ハッシュ関数でキーをハッシュ化してハッシュ出力長まで短縮し、そのハッシュを実効キーとして使用します。つまり非常に長いキーはハッシュ出力サイズを超えるセキュリティを提供しません。HMAC-SHA256では64バイトを超えるキーは32バイトにハッシュ化され、64バイトのキーに対してセキュリティ上の改善はありません;64バイト以下のキーはその全長が使用されます。
HMAC-SHA256の代わりにHMAC-SHA512を使うべき場合はいつですか?
プロトコルが要求する場合(HKDF-SHA512、Ed25519鍵生成などの一部の鍵導出関数)、多層防御のためにより広い署名が必要な場合、またはSHA-512がSHA-256より実際に高速な64ビットハードウェアで実行する場合にHMAC-SHA512を使用してください。ほとんどのWebアプリケーション、API署名、ウェブフック検証では、HMAC-SHA256で十分なセキュリティが提供され、エコシステム全体でより一般的な選択肢となっています。