HMAC Generator
Генерує підписи HMAC з SHA-256, SHA-384 або SHA-512
Повідомлення
Таємний ключ
Підпис 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 webhook secrets, підписанні запитів 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 проти простого хешу та шифрування
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 є найпоширенішим вибором для нових систем. Таблиця нижче порівнює варіанти, які вам найімовірніше доведеться використовувати.
| Алгоритм | Розмір дайджесту | Довжина hex | 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 застосовує базову хеш-функцію двічі з двома різними ключовими підкладками. Конструкція визначена у RFC 2104 і доведена як PRF (псевдовипадкова функція) за стандартними криптографічними припущеннями. Ключ спочатку доповнюється або хешується до відповідності розміру блоку хеш-функції (64 байти для SHA-256, 128 байтів для SHA-512).
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
Алгоритм виконує XOR доповненого ключа з константою внутрішньої підкладки (ipad, 0x36 повторений), конкатенує з повідомленням і хешує результат. Потім виконує XOR доповненого ключа з константою зовнішньої підкладки (opad, 0x5C повторений), конкатенує з виводом внутрішнього хешу і хешує знову. Ця подвійна структура хешування запобігає атакам розширення довжини і гарантує, що вивід 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)"