Veri sızıntıları kaçınılmaz bir risk olarak kabul edildiğinde asıl soru şudur: Veritabanınız çalınırsa saldırgan kullanıcı parolalarını elde edebilir mi? Doğru saklanan parolalar, sızıntıdan sonra bile pratikte kırılamaz. Yanlış saklananlar ise dakikalar içinde açığa çıkar ve kullanıcıların başka sitelerdeki hesaplarını da tehlikeye atar.
Asla yapılmaması gerekenler
- Parolayı düz metin saklamak
- Parolayı geri çözülebilir şekilde şifrelemek (anahtar çalınırsa tüm parolalar açılır)
- MD5 veya SHA-256 gibi hızlı hash fonksiyonlarını tek başına kullanmak
Hızlı hash fonksiyonları veri bütünlüğü için tasarlanmıştır; modern donanımla saniyede milyarlarca deneme yapılabilir.
Hash ve salt
Hash, tek yönlü bir dönüşümdür: parolayı hash'e çevirmek kolaydır, hash'ten parolaya dönmek mümkün değildir. Giriş sırasında kullanıcının girdiği parola tekrar hash'lenir ve karşılaştırılır.
Salt, her kullanıcı için rastgele üretilen ve parolaya eklenen değerdir. Aynı parolayı kullanan iki kullanıcının hash'leri farklı olur; önceden hesaplanmış hash tablolarıyla toplu kırma imkânsızlaşır. Salt gizli değildir, hash ile birlikte saklanır.
Yavaş hash algoritmaları
Parola için kasıtlı olarak yavaş ve ayarlanabilir maliyetli algoritmalar kullanılır:
| Algoritma | Not |
|---|---|
| Argon2id | Güncel öneriler arasında ilk tercih; bellek kullanımıyla donanım saldırılarına dirençli |
| bcrypt | Yaygın ve olgun; parola uzunluğu sınırına dikkat |
| scrypt | Bellek yoğun, iyi bir alternatif |
| PBKDF2 | Standartlara uyum gerektiren ortamlarda; yüksek tekrar sayısıyla kullanılmalı |
Maliyet parametreleri, sunucunuzda tek bir doğrulamanın makul bir sürede (yaklaşık birkaç yüz milisaniye altında) tamamlanacağı şekilde ayarlanmalı ve donanım geliştikçe artırılmalıdır.
.NET'te pratik yol
Kendi kriptografik kodunuzu yazmayın. ASP.NET Core Identity'nin parola hash'leyicisi PBKDF2 kullanır, salt'ı ve sürüm bilgisini otomatik yönetir; bağımsız kullanım için PasswordHasher<T> sınıfı da mevcuttur. Argon2 için olgun ve bakımı yapılan kütüphaneler tercih edilmelidir.
var hasher = new PasswordHasher<Kullanici>();
string hash = hasher.HashPassword(kullanici, parola);
var sonuc = hasher.VerifyHashedPassword(kullanici, hash, girilenParola);
// SuccessRehashNeeded dönerse parola yeni parametrelerle tekrar hash'lenip kaydedilir
Eski sistemden geçiş
MD5 veya SHA ile saklanmış parolalarınız varsa kullanıcıları zorla sıfırlamak yerine:
- Mevcut hızlı hash'i yeni yavaş algoritmayla sarmalayın (hemen koruma sağlar).
- Kullanıcı bir sonraki girişinde parolasını doğrulayıp doğrudan yeni algoritmayla kaydedin.
Parola politikası
- Uzunluk, karmaşıklıktan daha önemlidir: en az 12 karakter iyi bir hedeftir.
- Periyodik zorunlu değişiklik, kullanıcıları zayıf varyasyonlara iter; yalnızca sızıntı şüphesinde değiştirtin.
- Bilinen sızdırılmış parolaları reddedin.
- Uzun parolalara ve şifre yöneticisi kullanımına izin verin (yapıştırmayı engellemeyin).
- Mümkünse iki faktörlü doğrulama ve passkey sunun.
- Giriş denemelerini sınırlayın (rate limiting).
Sık sorulan sorular
"Parolamı unuttum" diyen kullanıcıya parolasını gönderebilir miyim?
Hayır. Doğru saklanmış parola geri getirilemez; kullanıcıya süreli ve tek kullanımlık bir sıfırlama bağlantısı gönderilmelidir.
Parolalara ek olarak "pepper" kullanmalı mıyım?
Veritabanı dışında saklanan gizli bir değer ek koruma sağlayabilir; ancak anahtar yönetimini karmaşıklaştırır ve temel önlemlerin yerine geçmez.
Sonuç
Parolaları yavaş, salt'lı ve güncel bir algoritmayla saklamak; bir veri sızıntısının kullanıcılarınız için felakete dönüşmesini önler. Hazır ve denenmiş kütüphaneleri kullanmak, bu işi doğru yapmanın en güvenli yoludur.