Sobes.tech
Middle

HMAC nedir ve nasıl kullanılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

HMAC (Hash tabanlı Mesaj Kimlik Doğrulama Kodu), gizli anahtar ve kriptografik bir hash fonksiyonu kullanarak mesajın bütünlüğünü ve doğruluğunu kontrol etmek için kullanılan bir mekanizmadır.

Çalışma algoritması:

  1. Gizli anahtardan iç ve dış anahtarların oluşturulması (ipad, opad).
  2. İç hash'in hesaplanması: hash(gizli anahtar XOR ipad + mesaj).
  3. Dış hash'in hesaplanması: hash(gizli anahtar XOR opad + iç hash). Bu HMAC'dir.

Kullanım alanları:

  • API isteklerinin kimlik doğrulaması: Sunucu ve istemci ortak gizli anahtar paylaşır. İstemci, isteğin verileri için HMAC hesaplar ve başlıkta gönderir. Sunucu, aynı veriler ve anahtar ile HMAC hesaplar ve karşılaştırır. Eşleşirse, istek doğrulanmış sayılır.
  • Veri bütünlüğü kontrolü: Mesajın HMAC'ı, yeniden hesaplanan HMAC ile uyuşuyorsa, verilerin iletim sırasında değiştirilmediğinden emin olunabilir.
  • JSON Web Token (JWT) kullanımı: HMAC, token verilerinin bütünlüğünü sağlamak için sıkça kullanılan dijital imza algoritmaları (HS256, HS384, HS512) olarak kullanılır.

Uygulama örneği (sözde kod):

function hmacSHA256(key, message) {
    // padding sabitleri
    const blockSize = 64; // SHA-256 için
    const ipad = 0x36;
    const opad = 0x5c;

    // Anahtarın hazırlanması
    let paddedKey = key;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // İç hash
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

    // Dış hash (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    return hmac;
}

// Gerçek kütüphanelerde, uygulama optimize edilmiştir ve farklıdır

Basit anahtar ile hash arasındaki temel fark (hash(anahtar + mesaj) veya hash(mesaj + anahtar)) HMAC'ın mesaj uzatma saldırılarına karşı dayanıklı olmasıdır, çünkü iki farklı padding sabiti ile iki aşamalı hash kullanır.