Furkan KapukayaYazılım geliştirme
Güvenlik ve KVKK3 dk okuma

Parolalar Nasıl Saklanmalı? Hash, Salt ve Argon2

Kullanıcı parolalarının güvenli saklanması; şifreleme ile hash farkı, salt, yavaş hash algoritmaları Argon2, bcrypt ve PBKDF2, eski sistemlerden geçiş ve parola politikası önerileri.

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:

AlgoritmaNot
Argon2idGüncel öneriler arasında ilk tercih; bellek kullanımıyla donanım saldırılarına dirençli
bcryptYaygın ve olgun; parola uzunluğu sınırına dikkat
scryptBellek yoğun, iyi bir alternatif
PBKDF2Standartlara 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:

  1. Mevcut hızlı hash'i yeni yavaş algoritmayla sarmalayın (hemen koruma sağlar).
  2. 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.