Ana içeriğe geç

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.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/hmac

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

Bir webhook imzasını doğrulamak (Node.js)javascript
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

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar