HMAC
Hash Tabanlı Mesaj Doğrulama Kodu
- Türkçe karşılığı
- mesaj doğrulama kodu
- Okunuşu
- eyçmek
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
HMAC, gizli bir anahtarı hash fonksiyonuyla birleştirip mesajın anahtarı bilen birinden geldiğini ve yolda değişmediğini kanıtlayan bir etiket (tag) üretir.
HMAC nedir?
SHA-256 gibi düz bir hash kazara yapılan değişiklikleri yakalar, ama herkes bir mesajla oynadıktan sonra onu yeniden hesaplayabilir. HMAC, dikkatle tasarlanmış iki adımlı bir yapıyla gizli bir anahtarı hash'leme işlemine karıştırır; böylece yalnızca anahtarı paylaşan taraflar geçerli bir etiket üretebilir ya da kontrol edebilir. 1996'da yayımlandı ve 1997'de standartlaştırıldı.
Web geliştirmenin her yerindedir. Stripe ve GitHub gibi webhook sağlayıcıları her istek gövdesini HMAC-SHA256 ve sizinle paylaştıkları bir sırla imzalar; böylece sunucunuz sahte olayları reddedebilir. HS256 algoritmasıyla imzalanan JWT'ler HMAC kullanır, AWS gibi bulut API'leri istekleri onunla imzalar, imzalı çerezler de oynanmayı tespit etmek için onu kullanır.
Bir etiketi doğrulamak basittir: alınan baytların birebir aynısı üzerinde HMAC'i paylaşılan sırla yeniden hesaplayıp karşılaştırırsınız. Karşılaştırma sabit sürede yapılmalıdır, crypto.timingSafeEqual ya da hmac.compare_digest gibi bir fonksiyonla; çünkü sıradan bir string karşılaştırması ilk farkta durur ve doğru etiketi zamanlama üzerinden sızdırabilir. İmzalanan veriye bir zaman damgası eklemek de eski mesajların tekrar oynatılmasını (replay) önler.
Sık yapılan bir yanlış, HMAC'in mesajı şifrelediğini düşünmektir. Hiçbir şeyi gizlemez; mesaj okunabilir kalır, etiket yalnızca bütünlüğü ve kaynağın doğruluğunu kanıtlar. İki taraf da aynı anahtarı paylaştığı için HMAC bir mesajı hangi tarafın gönderdiğini üçüncü bir kişiye de kanıtlayamaz; açık anahtarlı dijital imzalar bunun içindir.
Önemli noktalar
- HMAC, oynanması engellenen bir etiket üretmek için gizli bir anahtar ve bir hash kullanır.
- Etiketi yalnızca paylaşılan anahtara sahip olanlar üretebilir ya da doğrulayabilir.
- Webhook'lar, HS256 JWT'ler, API istek imzalama ve imzalı çerezler onu kullanır.
- Etiketleri sabit sürede karşılaştırın ve tekrar oynatmaya karşı zaman damgası ekleyin.
- Gizliliği değil bütünlüğü kanıtlar ve bir açık anahtar imzası değildir.
Örnek
import crypto from "node:crypto";
export function isValidWebhook(rawBody, signatureHeader, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody) // the exact bytes received, before JSON parsing
.digest("hex");
const a = Buffer.from(expected);
const b = Buffer.from(signatureHeader.replace(/^sha256=/, ""));
return a.length === b.length && crypto.timingSafeEqual(a, b); // constant-time compare
}Sık sorulan sorular
HMAC ile hash arasındaki fark nedir?
Hash'i herkes hesaplayabilir; bu yüzden yalnızca kazara değişiklikleri yakalar. HMAC ise ayrıca gizli bir anahtar gerektirir; böylece mesajın o anahtara sahip birinden geldiğini ve değiştirilmediğini kanıtlar.
HMAC ile dijital imza arasındaki fark nedir?
HMAC iki tarafta da paylaşılan tek bir gizli anahtar kullanır. Dijital imza ise imzalamak için özel bir anahtar, doğrulamak için açık bir anahtar kullanır; böylece herkes onu kontrol edebilir ve onu yalnızca anahtarın sahibi üretmiş olabilir.
HMAC karşılaştırması neden sabit sürede yapılmalı?
Normal bir karşılaştırma uyuşmayan ilk karakteri bulduğu anda döner; bu yüzden yanıt süreleri bir tahminin ne kadarının doğru olduğunu açığa çıkarır. Sabit süreli karşılaştırma her durumda aynı süreyi alır ve bu sızıntıyı kapatır.
İlgili sayfalar
- HashingGüvenlik, s. 12Hashing, bir girdiyi tek yönlü bir fonksiyonla sabit uzunlukta bir değere dönüştürmektir; veri bütünlüğünü doğrulamaya ve parolaları güvenle saklamaya yarar.
- WebhookBackend ve API'ler, s. 47Webhook, bir uygulamanın, tamamlanan bir ödeme gibi belirli bir olay gerçekleştiği anda sizin verdiğiniz bir URL'ye otomatik olarak gönderdiği HTTP isteğidir.
- JWTGüvenlik, s. 17JWT, kullanıcı kimliği ve son kullanma zamanı gibi bilgileri taşıyan, imzalı ve kompakt bir token'dır; sunucunun oturum aramadan istekleri doğrulamasını sağlar.
- Dijital İmzaGüvenlik, s. 8Dijital imza, özel anahtarla üretilen, bir mesajı ya da dosyayı kimin oluşturduğunu ve imzalandığından beri değişmediğini kanıtlayan kriptografik değerdir.
- API AnahtarıGüvenlik, s. 2API anahtarı, API çağrılarında uygulamayı veya projeyi tanımlayan, erişim denetimi, kullanım takibi ve hız sınırı için kullanılan benzersiz gizli bir dizedir.
- ŞifrelemeGüvenlik, s. 42Şifreleme, veriyi bir anahtarla karıştırarak yalnızca doğru anahtara sahip olanın onu özgün ve okunabilir hâline geri çevirebilmesini sağlama işlemidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin