Bu Araç Nedir?
HMAC, Hash Tabanlı Mesaj Kimlik Doğrulama Kodu anlamına gelir. Sabit uzunlukta bir özet üretmek için gizli bir anahtarı, bir mesajı ve standart bir hash fonksiyonunu (SHA-256 gibi) birleştirir. Aynı anahtara ve mesaja sahip herkes tam olarak aynı HMAC'ı hesaplar — ancak anahtar olmadan, kullanılan hash algoritmasını bilseniz bile bir mesaj için geçerli bir HMAC üretmek hesaplama açısından mümkün değildir.
Sıradan bir hash'ten temel fark budur: sıradan bir hash (MD5, SHA-256 vb.) yalnızca mesajı girdi olarak alır, dolayısıyla herkes onu hesaplayabilir ve kim tarafından oluşturulduğuna dair hiçbir şey kanıtlamaz. HMAC ise mesajın *yanı sıra* bir gizli anahtar da alır, bu yüzden geçerli bir HMAC göndericinin bu gizli anahtara sahip olduğunu kanıtlar — bu sadece bir bütünlük kontrolü değil, bir kimlik doğrulama mekanizmasıdır.
HMAC, NIST tarafından FIPS 198-1 belgesinde resmi olarak standartlaştırılmıştır ve internet protokolleri için IETF RFC 2104 belgesinde tanımlanmıştır. Bu araç, HMAC'leri tarayıcınızın yerel Web Crypto API'si (`crypto.subtle.sign`, HMAC algoritmasıyla) kullanarak hesaplar; bu API, elle yazılmış bir JavaScript sürümü yerine RFC 2104'ü doğru şekilde uygular.
Neden Kullanmalısınız?
- Stripe webhook endpoint'iniz staging ortamında sürekli "signature verification failed" döndürüyor ve hatanın kodda mı yoksa anahtarda mı olduğunu anlamanız gerekiyor — aynı payload ve webhook secret'ı buraya yapıştırıp hangi HMAC-SHA256'yı beklemeniz gerektiğini hemen görüyorsunuz.
- Her isteği HMAC-SHA1 ile imzalamanızı isteyen üçüncü taraf bir API'yi entegre ediyorsunuz ve dokümantasyon sadece Python örneği veriyor — istemci tarafı uygulamanızın aynı sonucu üretip üretmediğini bir satır kod yazmadan önce doğrulamak için aynı anahtar ve mesajla aynı HMAC'ı burada üretiyorsunuz.
- Bir iş arkadaşınız Node.js'te HMAC-SHA256 hesaplayan bir kod parçası gönderdi ve bilgisayarınıza Node kurmadan veya bir REPL başlatmadan çıktının doğru olduğunu hızlıca kontrol etmek istiyorsunuz.
- İki faktörlü kimlik doğrulama sisteminde hata ayıklamak için bir HOTP/TOTP belirteci üretmeniz gerekiyor ve son 6 haneli OTP koduna kısaltılmadan önceki ara HMAC'ı görmek istiyorsunuz.
- Bir mikroservise paylaşılan bir gizli anahtarla nasıl istek imzalanacağına dair dahili bir kılavuz yazıyorsunuz ve iş arkadaşlarınızın aynı değerleri yapıştırarak birebir yeniden oluşturabileceği doğrulanabilir bir örnek eklemek istiyorsunuz.
- %100 yerel: gizli anahtarınız ve mesajınız tarayıcıdan asla çıkmaz, bu yüzden gerçek üretim gizli değerlerini üçüncü taraf bir sunucuya gönderme riski olmadan test edebilirsiniz.
Nasıl Kullanılır
- "Gizli Anahtar" alanına gizli anahtarınızı girin.
- Kimliğini doğrulamak istediğiniz mesajı "Mesaj" alanına girin.
- HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 ve HMAC-SHA512 sonuçları anında oluşturulur (hedef sisteminiz büyük harf bekliyorsa "Büyük harf çıktı" seçeneğini işaretleyin).
- İhtiyacınız olan HMAC'ın yanındaki "Kopyala" düğmesine tıklayın.
Örnek
Giriş
Gizli Anahtar: key
Mesaj: The quick brown fox jumps over the lazy dogÇıkış
HMAC-SHA256: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA1: de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9Bu, standart ve yayımlanmış bir test vektörüdür: "key" anahtarı ve tam olarak bu mesajla, HMAC-SHA256 ve HMAC-SHA1 her doğru uygulamada her zaman bu değerleri üretir, böylece bu aracın çıktısını bağımsız olarak doğrulayabilirsiniz.
HMAC ile sıradan hash: anahtara ne zaman ihtiyacınız var
Belirleyici soru şudur: bu özeti kimin oluşturduğunu mu kanıtlamanız gerekiyor, yoksa sadece içeriğin değişmediğini mi? Herkese açık bir kontrol toplamı yeterliyse — indirilen bir dosyanın yayımcının belirttiğiyle eşleştiğini doğrulamak, kayıtları tekilleştirmek gibi — sıradan bir hash işe yarar ve herkes anahtar olmadan kontrol edebilir. Özetin yalnızca belirli bir gizli anahtara sahip biri tarafından üretilebileceğini kanıtlamanız gerekiyorsa — bir API çağıranı kimliklendirmek, bir webhook'un göndericisine güvenmek gibi — HMAC'a ihtiyacınız var; çünkü sıradan bir hash, hiçbir gizli anahtarı olmayan bir saldırgana gerçek göndericiyle aynı şekilde geçerli bir özet sahtelemesi imkanı tanır.
→ Çoklu Algoritma Hash Oluşturucu · JWT Çözücü · MD5 Oluşturucu
Dört HMAC algoritmasının karşılaştırması
Dördü de RFC 2104'teki aynı HMAC yapısını kullanır; yalnızca alttaki hash fonksiyonu ve dolayısıyla çıktı uzunluğu bakımından farklılık gösterirler.
| Algoritma | Çıktı boyutu | Tipik kullanım |
|---|---|---|
| HMAC-SHA1 | 160 bit (40 hex karakter) | Eski API'ler, eski OAuth 1.0a imzaları |
| HMAC-SHA256 | 256 bit (64 hex karakter) | API istek imzalama, JWT HS256, webhook doğrulama |
| HMAC-SHA384 | 384 bit (96 hex karakter) | Daha uzun çıktının gerektiği yüksek güvenceli imzalar |
| HMAC-SHA512 | 512 bit (128 hex karakter) | Yüksek güvenlikli uygulamalar için maksimum uzunlukta özetler |
Yaygın kullanım senaryoları
- Giden API isteklerini paylaşılan bir gizli anahtarla imzalamak, böylece sunucu çağıranın kimliğini doğrulayabilir.
- Gelen webhook yüklerini doğrulamak (Stripe-Signature, GitHub X-Hub-Signature-256 ve benzeri başlıkların hepsi HMAC-SHA256 kullanır).
- HS256/HS384/HS512 ile imzalanmış bir JWT'nin imza kısmını oluşturmak ve doğrulamak.
- Sunucu tarafı veya istemci tarafı HMAC uygulamanızın, dağıtımdan önce beklenen çıktıyla eşleştiğini test etmek.
Eşleşmeyen bir HMAC'ta hata ayıklama
Kodunuzun hesapladığı HMAC harici bir hizmetin beklediğiyle eşleşmediğinde, sorun neredeyse her zaman algoritmada değil girdide olur — bu araç tam da nedeni izole etmek için kullanışlıdır.
Aracın kendisinin beklendiği gibi çalıştığını doğrulamak için yukarıdaki örnekteki bilinen vektörle teste başlayın, ardından çıktının beklentilerinizle eşleşmeyi bıraktığı noktayı tam olarak bulana kadar anahtar ve mesajı kademeli olarak gerçek değerlerinizle değiştirin — bu, sorunun anahtar kodlamasında mı, mesajdaki boşluklarda mı yoksa seçilen algoritmada mı olduğunu hızlıca izole eder.
Sıkça Sorulan Sorular
HMAC nedir?
HMAC (Hash Tabanlı Mesaj Kimlik Doğrulama Kodu), hem mesajın bütünlüğünü hem de göndericinin anahtara sahip olduğunu kanıtlayan bir özet üretmek için gizli bir anahtarı bir hash fonksiyonu kullanarak mesajla birleştirir. NIST FIPS 198-1 ve IETF RFC 2104 belgelerinde tanımlanmıştır.
HMAC ile sıradan bir hash arasındaki fark nedir?
Sıradan bir hash (SHA-256, MD5 vb.) yalnızca mesajı girdi olarak alır — herkes onu hesaplayabilir, dolayısıyla sadece mesajın bozulmadığını kanıtlar, kimin gönderdiğini değil. HMAC ise mesajın yanı sıra bir gizli anahtar alır: bir mesajın belirli bir gizli anahtara sahip birinden geldiğini kanıtlamanız gerekiyorsa (bir API imzası, bir webhook göndericisi), HMAC'a ihtiyacınız var. Sadece bir dosyanın veya mesajın değişmediğini kontrol etmek istiyor ve yazarlığı kanıtlamayı önemsemiyorsanız, sıradan bir hash yeterlidir.
Gizli anahtarım bir sunucuya gönderiliyor mu?
Hayır. Bu araç HMAC'ı tamamen tarayıcınızda, Web Crypto API kullanarak hesaplar. Anahtarınız ve mesajınız hiçbir yere iletilmez — gerçek üretim ortamındaki gizli değerleri bile güvenle test edebilirsiniz.
Hangi algoritmayı kullanmalıyım — SHA-1, SHA-256, SHA-384 veya SHA-512?
Belirli bir sistem aksini gerektirmedikçe HMAC-SHA256 kullanın — API imzalama için fiili standarttır (AWS, Stripe, GitHub webhook'ları ve çoğu modern API tarafından kullanılır) ve güçlü bir güvenlik marjı sunar. HMAC-SHA1, eski sistemlerde (eski OAuth 1.0a uygulamaları gibi) hâlâ yaygındır ancak SHA-1'in altındaki hash daha zayıf kabul edilir; HMAC-SHA384/512 ise özellikle daha uzun çıktı veya ekstra güvenlik marjı gerektiğinde kullanılır.
Sade SHA-1 kırıldığına göre, HMAC-SHA1 güvensiz mi?
2017'deki çakışma (collision) saldırıları SHA-1'i sıradan bir hash fonksiyonu olarak kırdı, ancak HMAC-SHA1 hâlâ kriptografik olarak sağlam kabul edilir; çünkü HMAC'ın güvenliği çakışma direncine aynı şekilde bağlı değildir. Yine de yeni sistemler için HMAC-SHA256 veya daha üstünü tercih edin — pratik bir dezavantajı yoktur ve konuyu tamamen ortadan kaldırır.
HMAC'ın yaygın gerçek dünya kullanımları nelerdir?
REST API isteklerini imzalamak, böylece bir sunucu çağıranın paylaşılan API gizli anahtarına sahip olduğunu doğrulayabilir; Stripe, GitHub ve Shopify gibi hizmetlerden gelen webhook yüklerini doğrulamak, böylece bir isteğin gerçekten onlardan geldiğini ve sahte olmadığını bilirsiniz; iki faktörlü kimlik doğrulama için zaman tabanlı tek kullanımlık şifreler (TOTP/HOTP) üretmek; ve JWT belirteçlerini HS256/HS384/HS512 algoritmalarıyla imzalamak.
Hesapladığım HMAC, hizmetin beklediğiyle eşleşmiyor — en yaygın nedenler nelerdir?
En yaygın nedenler şunlardır: mesajda fazladan boşluk veya yeni satır karakterleri (özellikle payload bir metin editöründen veya günlükten kopyalandığında), yanlış anahtar kodlaması (bazı hizmetler anahtarın harfi harfine bir dize olarak değil, Base64'ten çözülmüş halde kullanılmasını bekler), beklenen hex çıktısında büyük/küçük harf uyumsuzluğu veya hizmetin test ettiğinizden biraz farklı bir payload'u imzalaması (örneğin farklı anahtar sırasına sahip JSON).
Gizli anahtarımı girmeden önce Base64 ile kodlamam mı gerekiyor, yoksa düz metin yeterli mi?
Bu, çalıştığınız hizmete bağlıdır: bazıları gizli anahtarı aldığınız metin dizesi olarak tam olarak ele alır, bazıları önce onu Base64'ten ham baytlara çözmenizi ister. Belirli API'nin dokümantasyonunu kontrol edin — değerler anahtar düz metin olarak girildiğinde eşleşmiyorsa, buraya yapıştırmadan önce Base64'ten çözmeyi deneyin.
Üretilen HMAC, mesajım ne kadar uzun olursa olsun neden hep aynı uzunlukta?
Bu, HMAC'ın dayandığı hash fonksiyonlarının temel bir özelliğidir: çıktı, tek bir kelimeyi mi yoksa tüm bir JSON belgesini mi imzaladığınıza bakılmaksızın algoritma tarafından belirlenen sabit bir boyuta sahiptir (SHA-1 için 160 bit, SHA-256 için 256 bit gibi). Bu da HMAC'ı öngörülebilir uzunlukta bir HTTP başlığında taşımayı pratik kılan şeydir.
Bu aracı zaten aldığım bir webhook'un imzasını doğrulamak için kullanabilir miyim?
Evet — alınan webhook'un tam, ham gövdesini Mesaj alanına, webhook gizli anahtarınızı da Gizli Anahtar alanına yapıştırın, ardından üretilen HMAC-SHA256'yı isteğin başlığındaki imzayla (Stripe-Signature gibi) karşılaştırın. Eşleşirlerse istek gerçektir; isteğin tam, ham gövdesini kullanmanız gerektiğini unutmayın, yeniden biçimlendirilmiş veya yeniden kodlanmış bir JSON sürümünü değil.