Tüm makaleler

HMAC: anahtarlı bir hash sıradan bir hash'ten nasıl farklıdır

Türkiye'nin en yaygın ödeme altyapılarından biri olan iyzico, her webhook bildirimini HMAC-SHA256 ile imzalar: entegrasyon kurulurken üye işyeri bir gizli anahtar alır, ve gelen her bildirimde yerel olarak yeniden hesaplanıp karşılaştırılması gereken bir imza bulunur. İmza eşleşmezse, bildirim aslında ödeme sağlayıcısından gelmemiştir — ve gerçek bir ödeme onayı olarak işlenmemelidir.

Neden sadece hash değil, gizli bir anahtar gerekir

SHA-256 gibi sıradan bir hash, yalnızca verinin aktarım sırasında bozulmadığını kanıtlar — kimin gönderdiğini değil. Bir sunucu sadece webhook gövdesini hash'leyip istekteki hash ile karşılaştırsaydı, bir saldırgan kendi sahte payload'unu oluşturup eşleşen bir hash ekleyebilirdi. HMAC, yalnızca gönderici ve alıcının bildiği bir gizli anahtarı işin içine katarak bunu çözer — anahtar olmadan, saldırgan hangi hash fonksiyonunun kullanıldığını tam olarak bilse bile geçerli bir imza üretmek pratikte imkânsızdır.

Bunun neden basitçe "anahtarın hash'i artı mesaj" olmadığı

Hash'lemeden önce anahtarı ve mesajı saf bir şekilde birleştirmek (örn. hash(anahtar + mesaj)) bazı hash fonksiyonlarında uzunluk uzatma saldırılarına karşı savunmasızdır — bir saldırgan bazen anahtarın tamamını bilmeden veri ekleyip yeni geçerli bir hash hesaplayabilir. HMAC, bu saldırı sınıfını tamamen kapatan, çift hash'leme ve iç/dış dolgu içeren özel bir yapı kullanır.

HMAC'in göründüğü diğer yerler

Webhook imzalamanın ötesinde, HMAC API isteklerini kimlik doğrular ve authenticator uygulamalarındaki altı haneli kodları üreten TOTP algoritmasının da temelini oluşturur.

Bu neden gereklidir

  • Ödeme sağlayıcılarından veya diğer üçüncü taraf hizmetlerden gelen webhook'ların gerçekliğini doğrulamak.
  • Gizli anahtarın kendisini ağ üzerinden hiç göndermeden API isteklerini imzalamak.
  • TOTP kodlarının ve oturum token'larının iç işleyişini anlamak.

Sabit zamanlı karşılaştırma

Alınan imzayı beklenenle sıradan === ile karşılaştırmak güvensizdir: bu operatör genellikle ilk farklı bayt noktasında durur, ve karşılaştırmanın yürütme süresi saldırgana ilk kaç baytı doğru tahmin ettiğini gösterir. Doğru kurulmuş bir webhook işleyici, ilk uyuşmazlığın nerede olduğuna bakmaksızın her zaman tüm baytları kontrol eden sabit zamanlı bir karşılaştırma fonksiyonu kullanır — örneğin PHP'de hash_equals veya Node.js'de crypto.timingSafeEqual.

Aracı dene