HMAC Üreticisi
SHA-256, SHA-384 veya SHA-512 ile HMAC imzaları oluştur
İleti
Gizli Anahtar
HMAC İmzası
HMAC imzası burada görüntülenecek…
HMAC Nedir?
HMAC (Hash tabanlı İleti Kimlik Doğrulama Kodu), RFC 2104'te tanımlanan ve sabit boyutlu bir kimlik doğrulama etiketi üretmek için bir hash fonksiyonunu gizli bir anahtarla birleştiren kriptografik bir yapıdır. Herkesin hesaplayabildiği düz bir hash'in aksine, HMAC yalnızca gizli anahtarı paylaşan taraflar tarafından oluşturulabilir ve doğrulanabilir. HMAC; bir iletinin hem bütünlüğünü hem de özgünlüğünü doğrulamak için standart mekanizmadır — verinin değiştirilmediğini ve güvenilir bir gönderici tarafından üretildiğini onaylar.
HMAC algoritması herhangi bir yinelemeli hash fonksiyonuyla çalışır: SHA-256, SHA-384, SHA-512 ve SHA-1 veya MD5 gibi eski fonksiyonlar. Ortaya çıkan yapı, temel aldığı hash'e göre adlandırılır: HMAC-SHA256, HMAC-SHA384 veya HMAC-SHA512. HMAC'ın güvenlik kanıtı hash fonksiyonunun çakışmaya karşı dirençli olmasına ve belirli sahte rastlantısallık özelliklerine sahip bulunmasına dayandığından, yeni sistemler için SHA-2 ailesi algoritmaları önerilen seçimdir. HMAC-SHA256, AWS Signature V4, Stripe webhook'ları, GitHub webhook gizli anahtarları, Slack istek imzalama ve JSON Web Token'ları (HS256) gibi sistemlerde kullanılan en yaygın varyantdır.
HMAC'ın tasarımı, düz hashing'in sahip olmadığı kritik bir özellik sağlar: uzunluk uzatma saldırılarına karşı direnç. Yalnızca SHA-256 kullanıldığında, H(ileti)'yi bilen bir saldırgan, özgün iletiyi bilmeden H(ileti || saldırgan_verisi)'ni hesaplayabilir. HMAC'ın çift hashleme yapısı (farklı dolgulu anahtarlarla iç hash ve dış hash), bu saldırıyı tamamen önler. API imza şemalarının, iletiyle gizli anahtarı birleştirip sonucu hashlemek yerine HMAC kullanmasının nedeni budur.
Neden Çevrimiçi HMAC Üreticisi Kullanılır?
HMAC imzaları hesaplamak genellikle kod yazmayı veya komut satırı araçları kullanmayı gerektirir. Bu tarayıcı tabanlı HMAC üreticisi, yazılım yüklemeden veya terminale geçmeden HMAC-SHA256, HMAC-SHA384 ve HMAC-SHA512 imzalarını anında oluşturmanızı sağlar.
HMAC Üreticisi Kullanım Senaryoları
HMAC vs Düz Hash vs Şifreleme
HMAC, düz hashing ve şifreleme farklı amaçlara hizmet eder. HMAC, ileti kimlik doğrulaması sağlar — iletinin gizli anahtara sahip biri tarafından oluşturulduğunu ve değiştirilmediğini kanıtlar. Düz hash, bütünlük sağlar ancak kimlik doğrulama sağlamaz. Şifreleme gizlilik sağlar. Aşağıdaki tablo bu ayrımları açıklar.
| Özellik | 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 Algoritması Karşılaştırması
HMAC herhangi bir hash fonksiyonunu kullanabilir; ancak temel algoritmanın seçimi çıktı boyutunu, güvenlik düzeyini ve tarayıcı uyumluluğunu belirler. HMAC-SHA256, yeni sistemler için en yaygın tercihdir. Aşağıdaki tablo karşılaşabileceğiniz varyantları karşılaştırmaktadır.
| Algoritma | Özet Boyutu | Onaltılık Uzunluk | Web Crypto API | En Uygun Kullanım |
|---|---|---|---|---|
| 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 İçeride Nasıl Çalışır?
HMAC, temel hash fonksiyonunu iki farklı anahtardan türetilmiş dolgularla iki kez uygular. Bu yapı RFC 2104'te tanımlanmış ve standart kriptografik varsayımlar altında PRF (sahte rastlantısal fonksiyon) olduğu kanıtlanmıştır. Anahtar önce hash fonksiyonunun blok boyutuna uyacak şekilde doldurulur veya hashlenir (SHA-256 için 64 bayt, SHA-512 için 128 bayt).
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
Algoritma, dolgulu anahtarı bir iç dolgu sabitiyle (ipad, tekrarlanan 0x36) XOR'lar, bunu iletiyle birleştirir ve sonucu hashler. Ardından dolgulu anahtarı bir dış dolgu sabitiyle (opad, tekrarlanan 0x5C) XOR'lar, bunu iç hash çıktısıyla birleştirir ve tekrar hashler. Bu çift hashleme yapısı, uzunluk uzatma saldırılarını önler ve gizli anahtarın bilinmeden HMAC çıktısının hesaplanamayacağını garanti eder.
HMAC Kod Örnekleri
HMAC, tüm büyük dillerde ve çalışma ortamlarında yerel olarak desteklenmektedir. Web Crypto API, tarayıcılarda herhangi bir kütüphane gerektirmeden HMAC-SHA256, HMAC-SHA384 ve HMAC-SHA512 sağlar. Aşağıdaki örnekler, webhook doğrulama ve sabit zamanlı karşılaştırma dahil gerçek dünya kullanım modellerini göstermektedir.
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)"