İ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.
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-MD5 | 80070713463e7749b90c2dc24911e275 |
| HMAC-SHA-1 | de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 |
| HMAC-SHA-256 | f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 |
| HMAC-SHA-384 | d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237 |
| HMAC-SHA-512 | b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a |
| KDF çapaları | Parametreler | Çıktı (onaltılık, ilk baytlar) |
| PBKDF2-HMAC-SHA-1 | parola / tuz, c=4096, 32 bayt | 4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db |
| PBKDF2-HMAC-SHA-256 | parola / tuz, c=4096, 32 bayt | c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a |
| HKDF-SHA-256 (RFC 5869 A.1) | IKM=0x0b×22, salt=00..0c, info=f0..f9, L=42 | 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 |
| HKDF-SHA-256 (RFC 5869 A.2) | IKM=00..4f, salt=60..af, info=b0..ff, L=82 | b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c… |
| HKDF-SHA-256 (RFC 5869 A.3) | IKM=0x0b×22, boş tuz ve info, L=42 | 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 |
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.