Parolaları veritabanında güvenli saklamak: hash, salt ve doğru algoritma
Veritabanı sızıntıları her gün yaşanıyor. Sızıntı olduğunda kullanıcılarının parolalarının açığa çıkıp çıkmayacağını, parolaları nasıl sakladığın belirler.
Asla yapılmaması gerekenler
- Düz metin saklamak.
- Şifrelemek (AES vb.). Şifreleme geri çevrilebilir; anahtar sızarsa tüm parolalar açılır. Parolayı geri okumana hiçbir zaman gerek yok.
- MD5, SHA-1 ya da tek başına SHA-256 kullanmak. Bunlar hızlı olmak için tasarlandı; modern ekran kartları saniyede milyarlarca deneme yapabilir.
Doğru yaklaşım: yavaş, tuzlu parola hash'i
Parola için özel tasarlanmış algoritmalar bilerek yavaştır ve her parolaya rastgele bir salt ekler. Böylece:
- Aynı parolayı kullanan iki kullanıcının hash'i farklı olur.
- Önceden hesaplanmış tablolar (rainbow table) işe yaramaz.
- Kaba kuvvet saldırısı çok pahalı hâle gelir.
Önerilen algoritmalar: Argon2id, bcrypt, scrypt.
Kendin yazma, dilin hazır fonksiyonunu kullan
PHP:
$hash = password_hash($parola, PASSWORD_DEFAULT);
if (password_verify($girilen, $hash)) { /* giriş başarılı */ }
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) { /* yeni hash'i kaydet */ }
Python (argon2-cffi):
from argon2 import PasswordHasher
ph = PasswordHasher()
h = ph.hash(parola)
ph.verify(h, girilen) # yanlışsa istisna fırlatır
Node.js: bcrypt veya argon2 paketleri.
Salt'ı ayrıca saklamana gerek yok; bu fonksiyonlar salt'ı ve ayarları hash metninin içine yazar.
Diğer önlemler
- Giriş denemelerini sınırla (IP ve hesap başına).
- Hata mesajında "e-posta yanlış" / "parola yanlış" ayrımı yapma; ikisi için de aynı mesajı ver.
- Parola sıfırlama bağlantıları tek kullanımlık ve kısa ömürlü olsun.
- Kullanıcılara iki adımlı doğrulama seçeneği sun.
- Asgari uzunluk iste (en az 8, tercihen 12+), karmaşık kompozisyon kurallarıyla kullanıcıyı boğma; sızdırılmış parola listelerinde olan parolaları reddetmek daha etkilidir.
Mevcut sistemi taşımak
Elinde MD5/SHA-1 hash'ler varsa: kullanıcı bir sonraki girişinde parolasını doğruladıktan sonra yeni algoritmayla yeniden hash'le ve eskisini sil. Giriş yapmayan hesaplar için zorunlu parola sıfırlaması düşün.
Sorunuz ya da eklemek istediğiniz bir nokta varsa bu başlıkta konuşabiliriz.