Anahtar türetme fonksiyonları: PBKDF2, Argon2 ve scrypt karşılaştırması
Parola tabanlı şifreleme için anahtar türetme fonksiyonlarını karşılaştırın. PBKDF2, Argon2 ve scrypt güçlü yönleri.
2026'da parola türetilen şifreleme anahtarları için Argon2id önerilen seçimdir (PHC galibi, OWASP'ın birinci tercihi, GPU ve ASIC saldırganlarına karşı aktif olarak savunulmuş), scrypt sağlam bir ikinci seçenektir (bellek-yoğun, kripto para birimlerinde yaygın), PBKDF2-SHA-256 ise 600.000'den fazla iterasyonla uyumluluk için hâlâ kabul edilebilir olmakla birlikte minimal GPU direnci sunar. Paylaşılan dosyayı korumak için kullanıcıların parola girdiği dosya aktarım uygulamaları için 3 iterasyon, 64 MiB bellek ve 4 paralelizmle Argon2id günümüzün temel çizgisidir. PBKDF2, Web Crypto API'ye yerleşik olduğundan ve WASM bağımlılığı gerektirmediğinden varlığını sürdürüyor. İşte üçünün nasıl farklılaştığı ve her birinin ne zaman kullanılacağı.
Karşılaştırma Tablosu
| Özellik | PBKDF2 | scrypt | Argon2id | |---|---|---|---| | Tanıtım yılı | 2000 (RFC 2898) | 2009 (RFC 7914) | 2015 (PHC galibi) | | Bellek-yoğun | Hayır | Evet | Evet | | Parametre esnekliği | Yalnızca iterasyon | N, r, p | zaman, bellek, paralelizm | | GPU direnci | Zayıf | Orta | Güçlü | | ASIC direnci | Çok zayıf | Orta | Güçlü | | Tarayıcı-yerel (Web Crypto) | Evet | Hayır | Hayır | | OWASP 2024 önerisi | Kabul edilebilir yedek | Kabul edilebilir | Tercih edilen | | Tipik tarayıcı maliyeti (modern donanım) | 600.000 iter = ~500 ms | N=2^17 = ~800 ms | 3 iter, 64 MiB = ~1 s |
Bellek-Yoğunluğun Neden Önemi Var
Parola tabanlı şifreleme için tehdit modeli çevrim dışı kaba kuvvet saldırısıdır. Saldırgan şifreli metni ve salt'ı ele geçirir, parola sözlüğünden geçer ve başarılı şifre çözme yapan anahtarı türetmeye çalışır. Savunma, her denemeyi pahalı kılmaktır.
PBKDF2, her denemeyi yalnızca CPU süresi açısından pahalı kılar (SHA-256 iterasyonları). Modern GPU'lar saniyede milyarlarca SHA-256 işlemi çalıştırır; bir oyun GPU'su günde 10-100 milyon PBKDF2-SHA-256-600000 tahmini test edebilir. ASIC saldırganları büyük ölçüde daha iyi performans gösterir.
Bellek-yoğun fonksiyonlar (scrypt, Argon2), deneme başına sabit miktarda bellek gerektirir. GPU'lar ve ASIC'lerin sınırlı bellek bant genişliği vardır, dolayısıyla cihaz başına paralelizm sınırlandırılmıştır. 64 MiB bellek gereksinimi, 16 GB VRAM'li bir GPU'nun milyonlarca değil en fazla 256 paralel tahmin çalıştırabileceği anlamına gelir. Kaba kuvvetin ekonomik maliyeti 2-3 büyüklük sırası artar.
PBKDF2: Eski Varsayılan
PBKDF2 (RFC 2898), tipik olarak HMAC-SHA-256 veya HMAC-SHA-512 olan bir sahte rastgele fonksiyonu parola ve salt üzerinde iterasyona uğratır. Yalnızca iterasyon sayısı ayarlanabilirdir.
const passwordKey = await crypto.subtle.importKey(
"raw", new TextEncoder().encode(password),
"PBKDF2", false, ["deriveKey"]
);
const aesKey = await crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt, // 16 rastgele bayt
iterations: 600000,
hash: "SHA-256",
},
passwordKey,
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"]
);
OWASP 2023, PBKDF2-SHA-256 için minimum 600.000 iterasyon öneriyor. NIST SP 800-132 daha eski ve daha az spesifik. Bazı spesifikasyonlar (örn. LastPass'ın 2018 varsayılanı olan 100.100) 2026'da çok düşük olarak değerlendiriliyor.
Avantajlar: Web Crypto'ya yerleşik, WASM yok, FIPS doğrulamalı, TLS 1.3 oturum devamında destekleniyor, Node ve tarayıcılarda aynı biçimde çalışıyor.
Sınırlamalar: bellek yoğunluğu yok, GPU ve ASIC hızlandırmasına karşı savunmasız. İterasyonları ikiye katlamak saldırgan maliyetini ikiye katlar ama aynı zamanda meşru kullanıcı maliyetini de ikiye katlar. Bir noktada meşru kullanıcılar beklemeyı reddeder ve iterasyonları sınırlandırırsınız.
scrypt: İlk Bellek-Yoğun Dağıtım
scrypt (RFC 7914), Colin Percival tarafından 2009'da Tarsnap için icat edildi. Parola materyalini büyük bir bellek tamponu üzerinde karıştırır ve saldırganı her tahmin sırasında bu tamponu bellekte tutmaya zorlar.
Üç parametre:
- N: maliyet faktörü (tipik olarak 2^14 ile 2^20 arası). Bellek kullanımı yaklaşık olarak 128 * N * r bayttır.
- r: blok boyutu (tipik olarak 8). Belleği ve GHASH iterasyon sayısını etkiler.
- p: paralelleştirme (tipik olarak 1). Yüksek değerler meşru hesaplamayı hızlandırır ama saldırganları da hızlandırır; genellikle 1'de bırakın.
OWASP, yaklaşık 128 MiB tüketen ve modern donanımda yaklaşık 800 ms'de çalışan N=2^17, r=8, p=1'i temel çizgi olarak öneriyor.
scrypt, Web Crypto API'de bulunmuyor. JavaScript'te scrypt-js, @noble/hashes veya libsodium.js kullanın. Litecoin ve Dogecoin scrypt'i iş ispatı olarak kullandığından, scrypt için özel ASIC geliştirme teşvik edilmiş ve orijinal ASIC'e karşı asimetrik avantajı kısmen aşındırmıştır.
Argon2id: 2026 Varsayılanı
Argon2, 2015'te Parola Hashing Yarışması'nı kazandı. Üç varyant: Argon2d (en hızlı, veri bağımlı, yan kanal açığı var), Argon2i (veri bağımsız, daha yavaş), Argon2id (hibrit, çoğu kullanım için önerilen). RFC 9106 bunu 2021'de standardize etti.
Üç parametre:
- t (zaman): bellek üzerinden iterasyonlar. Tipik olarak 2-3.
- m (bellek): KiB cinsinden bellek. Tipik olarak 65536 (64 MiB) veya daha fazla.
- p (paralelizm): paralelizm derecesi. Tipik olarak 1-4.
OWASP 2024 temel çizgisi: minimum için t=2, m=19456 (19 MiB), p=1; daha güçlü koruma için t=3, m=65536 (64 MiB), p=4.
import { argon2id } from '@noble/hashes/argon2';
import { utf8ToBytes } from '@noble/hashes/utils';
const derivedKey = argon2id(utf8ToBytes(password), salt, {
t: 3, m: 65536, p: 4, dkLen: 32
});
Veya argon2-browser (WASM) üzerinden:
import argon2 from 'argon2-browser';
const hash = await argon2.hash({
pass: password, salt,
type: argon2.ArgonType.Argon2id,
time: 3, mem: 65536, parallelism: 4, hashLen: 32
});
Argon2id, bellek erişim örüntüsü toplu bellek tasarımlarına daha az uygun olduğundan GPU saldırganlarını scrypt'ten daha etkili biçimde devre dışı bırakır. Argon2 için ASIC'ler araştırmada mevcut; ancak henüz saldırgan ölçeğinde ekonomik olarak dağıtılmamış.
Uygulamanız için Parametre Seçimi
Kalibrasyon yöntemi: kullanıcılarınızın tolere ettiği en uzun beklemeyi seçin (genellikle 500 ms ile 2 saniye arası), en yavaş hedef cihazda ölçün ve o bütçeye ulaşacak şekilde parametreleri ayarlayın.
Türetmenin yükleme sırasında bir kez ve indirme sırasında bir kez gerçekleştiği HexaTransfer tarzı parola korumalı dosya paylaşımları için 1-2 saniye kabul edilebilirdir. Parametreler:
- PBKDF2-SHA-256: 600.000-1.200.000 iterasyon
- scrypt: N=2^17, r=8, p=1
- Argon2id: t=3, m=65536, p=4
Kullanıcının parolasını girdikten sonra beklediği giriş sistemleri için UX tavanı 300-500 ms'dir. Parametreler yaklaşık yarıya düşer. Kullanıcının beklemediği toplu senaryolar için (örn. arka planda yeniden şifreleme) 3-5 saniyeye çıkarın.
Salt Yönetimi
Her üç KDF de bir salt gerektirir. Kurallar:
- Minimum 16 rastgele bayt
Math.random()değil,crypto.getRandomValues()aracılığıyla üretilmeli- Parola başına benzersiz (Alice ve Bob aynı parolayı kullanıyorsa, türetilen anahtarların farklı olması için salt'ları farklı olmalı)
- Gizli değil — şifreli metinle birlikte depolayın
Pepper (tüm türetmelere eklenen gizli bir değer) bazen tartışılır. "Sunucu"nun yalnızca bir nesne deposu olduğu dosya aktarımında, sunucu taraflı gizli olmadığından pepper bir değer katmaz. Hesap tabanlı sistemlerde, parola veritabanından ayrı depolanan sunucu taraflı pepper, veritabanı dökümlerini saldırganlar için daha az kullanışlı kılar.
KDF'ler Arasında Göç
PBKDF2'den Argon2id'ye geçmek istiyorsanız mevcut bir dağıtımınız varsa:
- KDF tanımlayıcısını şifreli metin meta verilerinde saklayın (
"kdf": "pbkdf2-sha256-600000"veya"kdf": "argon2id-3-65536-4") - Yeni yüklemelerde Argon2id kullanın
- Şifre çözme sırasında KDF tanımlayıcısını okuyun ve eşleşen fonksiyonu kullanın
- Eski şifreli metinleri körce yükseltmeyin; yeniden türetmek için parolaya ihtiyaç duyarsınız
LastPass, 1Password ve Bitwarden bu göçten geçti. Üçü de artık 600.000'den fazla iterasyonla PBKDF2'yi varsayılan olarak kullanmakta; daha yeni sürümlerde Argon2id mevcut. Evet, parola yöneticileri bile Argon2'ye geçmekte yavaş kaldı; ekosistem araçlarının olgunlaşması zaman aldığından kademeli olarak yayılıyor.
bcrypt Hakkında
bcrypt (1999), mütevazı bellek yoğunluğuyla iyi bir parola karma fonksiyonudur. Girdiyi 72 bayta sınırlar (meşhur bir tuzak — uzun parolalar sessizce kesilir). Ruby on Rails ve pek çok PHP çerçevesinin tarihsel varsayılanıdır. 2026'da yeni kodlar için Argon2id'yi tercih edin; mevcut sistemleri korumak için bcrypt yeterlidir.
Gerçekçi Öneri
2026'da yeni bir dosya aktarım hizmeti için:
- 15-200 KB bağımlılık gönderebiliyorsanız: @noble/hashes veya libsodium.js üzerinden Argon2id
- Sıfır bağımlılık ve her koşulda en küçük paket boyutu gerekiyorsa: Web Crypto aracılığıyla 600.000 iterasyonla PBKDF2-SHA-256
- Kripto para cüzdanı veya eski scrypt devralan bir şey yazıyorsanız: N=2^17 ile scrypt
Hassas dosyaları işleyen üretim uygulamaları için Argon2id, WASM bağımlılığına değer. Kullanıcıların zaten rastgele parola ürettiği basit parola korumalı paylaşımlarda, entropi parolada olduğundan KDF'de değil, PBKDF2 yeterlidir.
hexatransfer.com'da deneyin — ücretsiz, hesap gerekmez, 10 GB'a kadar.
Uçtan uca şifreleme ile büyük dosyaları güvenle gönderin
Uçtan uca şifreleme ile 10 GB'a kadar dosya ücretsiz aktarın. Hesap gerekmez. Dosyalarınız yüklenmeden önce tarayıcınızda şifrelenir — başka kimse okuyamaz.
Dosya gönder