HMAC, PBKDF2 & HKDF Hesaplayıcı

Metin, onaltılık baytlar ya da tüm dosyalar üzerinde (RFC 2104) HMAC-MD5, HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-384 veya HMAC-SHA-512 ile anahtarlı bir mesaj doğrulama kodu hesaplayın — anahtarlar metin, onaltılık ya da Base64 olarak. Ya da PBKDF2 (RFC 8018) ve HKDF (RFC 5869) ile anahtar türetin. Her sonuç onaltılık, büyük harf onaltılık, Base64 ya da Base64url olarak gösterilebilir. Düz özetler için Karma Üretecine; sağlama toplamları için CRC Hesaplayıcıya; JWT'lerin içinde kullanılan HMAC için JWT Çözücüye bakın.
Tamamen yerel çalışır — anahtarlar ve mesajlar sekmenizden asla ayrılmaz. 200 MB'a kadar dosyalar.
Yapı: Çıktı:
HMAC algoritması: RFC 2104 — MD5 varyantı md5.js gerektirir (bu sayfa tarafından yüklenir).
Onaltılık okuma boşlukları, iki nokta üst üste işaretlerini ve 0x önekleri kabul eder; Base64 dolgulu ya da dolgusuz standart biçimde olmalıdır.
Boş bir anahtar RFC 2104 uyarınca geçerlidir ama neredeyse her zaman bir hatadır — anahtarsız HMAC yalnızca yavaş bir karmadır.
İlk satır kullanılan tam parametreleri (algoritma, okuma, girdi boyutları) kaydeder; böylece kopyalanıp yapıştırılan bir sonuç her zaman yeniden üretilebilir.
Hangi yapıya ihtiyacınız var?
HMAC, paylaşılan bir sırrı ve bir iletiyi bir doğrulayıcıya dönüştürür: anahtarı bilen alıcı bunu yeniden hesaplayıp kurcalamayı algılayabilir. İmzalı her JWT'deki “HS256” budur (bkz. JWT Çözücü) ve dünyadaki API isteği imzalama şemalarının yarısıdır. PBKDF2, insan parolasını bir anahtara dönüştürmek içindir: HMAC'i binlerce kez tekrarlar, böylece her parola tahmini saldırgana aynı gecikmeyi yükler. HKDF, protokol anahtarları içindir: zaten rastgele olan sır baytlarını (örneğin bir DH paylaşılan sırrını) alır ve güvenle birkaç amaca bağlı anahtara genişletir — TLS 1.3 tüm trafik anahtarlarını bu şekilde türetir. Pratik kural: doğrula → HMAC; parola → PBKDF2 (ya da scrypt/Argon2, yayımlandığında Parola Karma Üreteci'ne bakın); tekdüze sır → HKDF.
Öz test
Sayfa motorlarını yayımlanmış vektörlere karşı çalıştırır: 10 HMAC çapası (RFC 2202/4231 tarzı, beş algoritma × iki girdi), 6 PBKDF2 çapası (SHA-1 ve SHA-256 üç yineleme sayısında) ve dört RFC 5869 HKDF test durumu A.1–A.4. Hiçbir şey bir yere gönderilmez.
HMAC, PBKDF2 ve HKDF — anahtarlı karma sıfırdan açıklanmış
Tek cümlede: SHA-256 gibi çıplak bir karmayı herkes hesaplayabilir, bu yüzden bir iletinin kimden geldiği konusunda hiçbir şey kanıtlamaz — HMAC, yalnızca anahtar sahiplerinin özeti üretebilmesi (ya da doğrulayabilmesi) için gizli bir anahtar karıştırır; PBKDF2 ve HKDF, sırları anahtarlara dönüştürmek için aynı HMAC makinesini yeniden kullanır: parolalar için yavaş, zaten rastgele materyal için hızlı.
HMAC nedir (RFC 2104)

Yapı. HMAC bir değil, iki karma çalıştırmasıdır. Anahtarınız karmanın blok boyutuna dolgulanır (MD5/SHA-1/SHA-256 için 64 bayt, SHA-384/512 için 128); ileti, anahtar ile sabit bir iç dolgunun XOR'u ile bir kez karmalanır ve bu özet, anahtar ile sabit bir dış dolgunun XOR'u ile yeniden karmalanır. Bu çift sandviç, altta yatan karma iyi bir sözde-rastgele işlev olduğu sürece kanıtlanabilir biçimde güvenlidir — bu yüzden HMAC-MD5, düz MD5'i kıran pratik çakışma saldırılarına hâlâ direnir (yine de aşağıda görüldüğü gibi emekliye ayrılmıştır).

Anahtarlar. Herhangi bir anahtar uzunluğu çalışır: blok boyutundan kısa olanlar olduğu gibi kullanılır (ama 32 bayttan kısalar hoş görülmez), daha uzun olanlar önce karmalanır. Aynı sayfa anahtarı metin, onaltılık ya da Base64 olarak yazmanıza izin verir; böylece 64 onaltılık karakterlik bir üretim anahtarı, birisi onu 64 karakterlik bir metin parolasıyla karıştırmadan yapıştırılabilir — okuma, tam olarak bu nedenle çıktı satırına kaydedilir.

Nerede karşılaşırsınız. Bir JWT başlığının HS256 alanı, tam olarak bayt olarak base64url kodlanmış belirteç parçaları üzerinde HMAC-SHA-256'dır (bu sitedeki JWT Çözücü, bir HS256 sırrını yapıştırdığınızda tam olarak bunu hesaplar). Webhook imzaları (Stripe, GitHub), AWS SigV4, (eski sürümlerde) TLS kayıt koruması ve OpenSSH'ın umac-64@openssh.com kuzeni hepsi aynı aileye aittir.

Neden yalnızca hash(message || key)? Uzunluk genişletmesi: MD5/SHA-1/SHA-2 ailesindeki her karma, H(secret || msg)'i bilen bir saldırganın sırrı bilmeden H(secret || msg || padding || anything)'i hesaplamasına izin verir. HMAC'in iç/dış ayrımı bu saldırı sınıfını ortadan kaldırır. API imza kodunda en yaygın kendin-yap hatasıdır — ve HMAC'in var olmasının nedeni de budur.

PBKDF2 nedir (RFC 8018)

Tasarım gereği yavaş. Bir parolanın belki 40 bit gerçek entropisi vardır; bir saldırganın GPU'su saniyede milyarlarca ham SHA-256 dener. PBKDF2, HMAC(password, salt) işlemini tekrar tekrar çalıştırır — iter kez — böylece her tahmin, sizin ve saldırganın için aynı iter HMAC maliyetine sahip olur. Buradaki varsayılan, HMAC-SHA-256 ile 600.000 yinelemedir; OWASP Parola Depolama Kopya Kağıdı temel değeridir; kaydırıcı on milyona kadar gider, çünkü donanım hızlandıkça güvenlik kılavuzları yukarı doğru tırmanır.

Tuz. Parola başına rastgele bir tuz, aynı kullanıcıların artık aynı karmalanmadığı anlamına gelir ve önceden hesaplanmış tablolar (gökkuşağı tabloları) değersizleşir. Gizli değildir — karmanın yanında saklanır — yalnızca benzersiz olması gerekir. 16 rastgele bayt olağandır.

Bilinen zayıflık. PBKDF2 CPU'ya zor ama bellek açısından zor değildir: GPU'lar ve ASIC'ler onu mükemmel biçimde paralelleştirir. Bu yüzden modern tavsiye, bir parola karması saklanırken tasarlanıyorsa scrypt ya da Argon2id'dir (bu ailedeki Parola Karma Üreteci sayfası bunları kapsar); PBKDF2 ise uyumluluk ve FIPS-140 ayarları için hâlâ doğru cevaptır.

HKDF nedir (RFC 5869)

Çıkar, sonra genişlet. HKDF iki iş yapar. Çıkarma: belki düzensiz girdi anahtar materyalini (örneğin bir Diffie–Hellman paylaşılan sırrını) bir tuzla birlikte tek bir kısa sözde-rastgele anahtara sıkıştırır: PRK = HMAC(salt, IKM). Genişletme: bu PRK'yı 255 karma bloğuna kadar herhangi bir uzunluğa gerer; her çıktı bloğu bir öncekine zincirlenir ve info alanıyla etiketlenir. Sonuç, tek bir sırrın size güvenle bir şifreleme anahtarı, bir MAC anahtarı ve bir IV vermesidir — hepsi birbirinden ayrık.

Parolalar için değil. HKDF, girdisinin zaten tam entropiye sahip olduğunu varsayar — 32 çıktı baytı başına bir HMAC yapar, bu yüzden insan parolası onu neredeyse anında geçer, tam da saldırganın istediği şey budur. Parolaları PBKDF2 yerine HKDF'den geçirmek klasik bir tasarım hatasıdır; info alanı amaç etiketleri içindir ("client traffic key", "server iv"), ek entropi için değil.

Nerede karşılaşırsınız. TLS 1.3, kullandığı her anahtarı el sıkışma sırrından HKDF ile türetir; WireGuard, Signal, EAP-TLS 1.3 ve JSON Web Encryption (doğrudan anahtar anlaşması KDF'si olarak) hepsi aynı soy ağacında yer alır.

Çapa değerleri — bu sayfada yeniden üretin

İlk iki tablo, bu sayfanın Örnek düğmesinin ve kendi testinin dayandığı test vektörleridir (anahtar "key", mesaj “The quick brown fox jumps over the lazy dog”; sonra RFC tarzı bir 16 baytlık 0x0b anahtarı ve “Hi There” mesajı örneği). Hepsi bağımsız bir yerel uygulama tarafından üretilmiş ve bu sayfada yeniden doğrulanmıştır.

"fox" üzerinde HMAC, anahtar = keyÖzet (onaltılık)
HMAC-MD580070713463e7749b90c2dc24911e275
HMAC-SHA-1de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
HMAC-SHA-256f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA-384d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237
HMAC-SHA-512b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a
KDF çapalarıParametrelerÇıktı (onaltılık, ilk baytlar)
PBKDF2-HMAC-SHA-1parola / tuz, c=4096, 32 bayt4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db
PBKDF2-HMAC-SHA-256parola / tuz, c=4096, 32 baytc5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a
HKDF-SHA-256 (RFC 5869 A.1)IKM=0x0b×22, salt=00..0c, info=f0..f9, L=423cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865
HKDF-SHA-256 (RFC 5869 A.2)IKM=00..4f, salt=60..af, info=b0..ff, L=82b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c…
HKDF-SHA-256 (RFC 5869 A.3)IKM=0x0b×22, boş tuz ve info, L=428da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8
Yaygın hatalar
  • HMAC'i şifrelemeyle karıştırmak. HMAC bütünlüğü ve kökeni kanıtlar (paylaşılan bir sır varsayılarak); hiçbir şeyi gizlemez. Anahtarı olmayan herkes tam iletiyi yine görür.
  • HMAC'i bir imzayla karıştırmak. Dijital imzalar açık anahtarlıdır: biri imzalar, herkes doğrular. HMAC simetriktir: her doğrulayıcı da sahtesini üretebilir. İnkâr edememe için RSA/ECDSA gerekir (yayımlandığında bu ailedeki RSA aracına bakın), HMAC değil.
  • Anahtar okuma uyuşmazlıkları. Bir Metin anahtar kutusuna yapıştırılan 64 karakterlik bir onaltılık dizge 32 değil 64 bayt olur — ve HMAC tamamen değişir. Bu sayfa okumayı çıktı satırına yazar; iki araç anlaşmazlığa düştüğünde karşılaştırılacak ilk şey budur.
  • PBKDF2 yinelemesi çok düşük. 1.000 yineleme 2000 yılında makuldü; bugün GPU'lar onu yer. Sisteminiz hâlâ 1.000 yinelemeli karmaları saklıyorsa, girişte yeniden karmalama geçişi planlayın.
  • Bir parola üzerinde HKDF. Çıktı bloğu başına bir HMAC, bir parolanın anında geçmesi demektir — parolalar için PBKDF2 (ya da Argon2id), yüksek entropili sırlar için HKDF kullanın.
  • Tek bir türetilmiş anahtarı her şey için yeniden kullanmak. Düzeltmesi bedavadır: farklı info etiketleriyle ayrı anahtarlar türetin. Aynı IKM'den farklı etiketlerle türetilen iki anahtar tasarım gereği bağımsızdır.
SSS

HMAC-MD5 kırıldı mı? Çakışmaya dayanıklı bir karma olarak MD5 ölüdür, ama HMAC-MD5'in güvenliği MD5'in sözde-rastgele bir işlev olarak davranmasına bağlıdır ve bilinen pratik bir kırılma yoktur. Yine de emekliye ayrıldı — eski bir protokolle uyumluluk dışında HMAC-SHA-256 yerine onu seçmek için bir neden yoktur.

HMAC anahtarım ne kadar uzun olmalı? En az karmanın çıktı boyutu kadar (SHA-256 için 32 bayt) ve bir CSPRNG ile üretilmiş olmalı. Özetten kısa bir anahtara izin verilir, ama onun altındaki her bit doğrudan güvenliği azaltır.

PBKDF2'de daha fazla yineleme sonsuza dek “daha güvenli” mi olur? Saldırganın maliyetini doğrusal olarak artırır, ama sizin giriş maliyetinizi de doğrusal olarak artırır. Oyun, kullanıcılarınızın tolere edeceği en büyük sayıyı seçmektir — OWASP'ın rakamları bunu kalibre eder.

HKDF neden 255 × karma boyutuyla sınırlı? Genişletme döngüsü T(i) = HMAC(PRK, T(i-1) || info || i) biçimindedir ve bir baytlık bir sayaç i kullanır — 255 en büyük sayaç değeridir, RFC 5869'un katı bir yapısal sınırıdır, bir politika tercihi değildir.

Bu sayfadaki PBKDF2 ile Parola Karma Üreteci arasındaki fark nedir? Aynı algoritma, farklı iş. Bu sayfa başka yerde kullanmanız için ham anahtar baytları türetir; parola karma sayfası ise saklanan kimlik bilgisi dizgileri üretir (gömülü tuz ve parametrelerle) ve yapıştırılan adayları bunlara karşı doğrular.