İçeriğe geç

Parola Saklama — Kullanıcı Tablosu Sızdı, Şimdi Ne Olacak?

Orta 8 dk Sık karşılaşılır

Önce şunu oku: Spring Security Filter Chain

30 saniyede özet

Parola şifrelenmez, hash'lenir. Tuzsuz hızlı bir hash aynı parolaları ele verir ve hazır tablolara yenilir; tuz bunu durdurur ama tahmini ucuz bırakır. bcrypt gibi yavaş bir hash ile sızmış parolaları kayıtta reddetmek birlikte çalışır.

Bir baharatçı tariflerini kavanozların üstüne yazıyor; dükkâna giren herkes okuyabiliyor. Sonra hepsini toz hâline getiriyor. Ama aynı karışımın iki kavanozu birebir aynı görünüyor ve bilinen karışımların bir listesi bakar bakmaz eşleşiyor.

  1. Bayt: Parolaları düz yazmıyoruz, SHA-256 ile saklıyoruz. Güvendeyiz, değil mi?

  2. Sen: Kullanıcı tablosu sızdı. Saldırgan dört hesabın parolasını birkaç dakikada buldu.

  3. Bayt: Ayşe ile Mehmet'in hash'i birebir aynı! İkisi de 123456 kullanıyormuş.

  4. Bayt: Her kavanoza ayrı bir tutam ekleyip yavaş öğütmemiz gerekiyormuş.

Şifreleme değil, hash

Şifrelenen bir şey anahtarla geri açılır; anahtar sızarsa hepsi açılır. Parola ise hash’lenir: geri çözülemez. Girişte yazılan parola aynı yolla hash’lenir ve kayıtlı hash’le karşılaştırılır.

Ama her hash parola için uygun değildir. SHA-256 hızlıdır ve tuz yoksa aynı parola her zaman aynı hash’i üretir.

Kafam karıştı, daha basit anlat

Parola geri açılmaz; girişte yeniden hash’lenip karşılaştırılır.

Hızlı kontrolBaşlangıç

Parolalar veritabanında neden düz metin olarak saklanmaz?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Parola şifrelemek ile hash'lemek arasındaki fark nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuz ve yavaşlık

Parolalar tuzlu SHA-256 ile saklanıyor. Can'ın parolası Qwerty123, sızmış listelerde var. Saldırgan onu bulabilir mi? Cevabı göster

Bulabilir. Tuz hazır tabloları işe yaramaz kılar ve aynı parolaları farklı gösterir. Ama SHA-256 hızlıdır; saldırgan yaygın parolaları Can’ın tuzuyla tek tek, ucuza dener.

Tuzla, yavaş öğüt; bilinen karışımı reddet.
Adım adım oku
  1. Tarif kavanozun üstünde: herkes okur.
  2. Toz yap: ama aynı karışım, aynı toz.
  3. Her kavanoza ayrı tutam, yavaş öğüt.
  4. Tuzla, yavaş öğüt; bilinen karışımı reddet.

tuzHer kullanıcı için rastgele üretilip parolaya eklenen değer. Aynı parolaların aynı hash'i üretmesini ve hazır tabloların işe yaramasını engeller.Sözlükte gör →, her kullanıcı için rastgele üretilip parolaya eklenen değerdir. Aynı parolalar artık aynı görünmez ve hazır tablolar işe yaramaz.

parola hash'iParolanın geri çözülemeyen, kasıtlı yavaş ve tuzlu bir özetini saklamak. Girişte yazılan parola aynı yolla hash'lenip karşılaştırılır.Sözlükte gör → için bcrypt, scrypt ya da Argon2 gibi kasıtlı yavaş algoritmalar kullanılır. Her tahmin pahalıdır; ama 123456 gibi bir parola listenin başındadır ve yine bulunur. Bu yüzden sızmış parolalar kayıtta reddedilir.

Kafam karıştı, daha basit anlat

Tuz tabloları durdurur. Yavaş hash tahmini pahalı yapar. Zayıf parolayı ise kayıtta reddet.

Hızlı kontrolOrta

Tuzsuz SHA-256'da iki kullanıcının hash'i birebir aynı. Bu ne anlatır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

SHA-256 tuzlu olsa bile parola için neden yeterli değildir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Kullanıcı tablosu sızdı

Tohum 575108
  1. Ayşe · sızmış listelerdeki bir parola
  2. Mehmet · sızmış listelerdeki bir parola
  3. Zeynep · sızmış listelerdeki bir parola
  4. Can · sızmış listelerdeki bir parola
  5. Elif · uzun, benzersiz parola
  6. Deniz · uzun, benzersiz parola

Risk altındaki hesap: 0

Hız
Adım 0

Şu an ne oldu?

SHA-256, tuzsuz

Saldırgan sızan tabloyu inceliyor.

Görevler0/3

  • İki kullanıcının aynı parolayı kullandığı tablodan anlaşılsınaçık

    İpucu

    Tuz yok.

  • bcrypt kullan, yine de bir hesap risk altında kalsınaçık

    İpucu

    Zayıf parolalara izin ver.

  • Hiçbir hesap tahminle açılmasınaçık

    İpucu

    Yavaş hash ve sızmış parola kontrolü birlikte.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Tuzsuz SHA-256: dört yaygın parola hazır tablolarda anında bulundu, Ayşe ile Mehmet’in hash’i aynı.
  2. “Tuzlu SHA-256” seç. İkizler gizlendi; ama dört parola yine ucuza tahmin edilir.
  3. “bcrypt” seç. Her tahmin pahalı; dört yaygın parola yine risk altında.
  4. Sızmış parola kontrolünü aç. bcrypt ile birlikte hiçbir hesap tahminle açılmıyor.
Hızlı kontrolOrta

Tuz (salt) neyi engeller?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

bcrypt kullanılıyor. Kullanıcının parolası 123456. Güvende mi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Giriş denemelerini sınırlamamak. Saldırganın hash’e hiç ihtiyacı yoktur; yaygın parolaları canlı giriş ekranında da dener. Hatalı denemeleri sınırla ve izle.

Algoritmayı değiştirememek. Hash’in başına {bcrypt} gibi bir önek yazan bir encoder, eski ve yeni algoritmaların yan yana çalışmasını sağlar. Kullanıcı giriş yaptığında parolası yeni algoritmayla yeniden hash’lenir.

Karmaşıklık kurallarına güvenmek. “Bir büyük harf, bir rakam” kuralı Qwerty123 gibi tahmin edilebilir kalıplar doğurur. Uzunluk ve sızıntı kontrolü daha etkilidir.

Kafam karıştı, daha basit anlat

Denemeleri sınırla, algoritmayı değiştirilebilir tut, uzunluğa ve sızıntı kontrolüne güven.

Hızlı kontrolOrta

Spring Security'de PasswordEncoderFactories.createDelegatingPasswordEncoder() ne sağlar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Mobil bankacılık: parola saklama ve geçiş 4 dosya · ~56 satır · ilk okumada atlayabilirsin
Proje dosyaları

auth/src/main/java/com/bank/auth/ PasswordConfig.java Encoder: önekli hash; varsayılan bcrypt, eski SHA-256 kayıtlar da doğrulanabilir.

auth/src/main/java/com/bank/auth/PasswordConfig.java
@Configuration
class PasswordConfig {
@Bean
PasswordEncoder passwordEncoder() {
// Writes "{bcrypt}$2a$..." and can still verify older "{sha256}..." hashes.
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}

auth/src/main/java/com/bank/auth/ SignUpService.java Kayıt: sızmış parola listesine ve uzunluğa bakılıyor.

auth/src/main/java/com/bank/auth/SignUpService.java
@Service
class SignUpService {
private static final int MIN_LENGTH = 12;
private final PasswordEncoder encoder;
private final BreachedPasswords breached;
private final CustomerCredentials credentials;
SignUpService(PasswordEncoder encoder, BreachedPasswords breached, CustomerCredentials credentials) {
this.encoder = encoder;
this.breached = breached;
this.credentials = credentials;
}
void setPassword(UUID customerId, String rawPassword) {
if (rawPassword.length() < MIN_LENGTH) {
throw new WeakPasswordException("Parola en az " + MIN_LENGTH + " karakter olmalı.");
}
if (breached.contains(rawPassword)) {
throw new WeakPasswordException("Bu parola daha önce sızmış bir listede var. Başka bir parola seçin.");
}
credentials.save(customerId, encoder.encode(rawPassword)); // salt is generated inside
}
}

auth/src/main/java/com/bank/auth/ UpgradingPasswordService.java Geçiş: başarılı girişte eski algoritmalı hash yenisiyle değiştiriliyor.

auth/src/main/java/com/bank/auth/UpgradingPasswordService.java
@Service
class UpgradingPasswordService implements UserDetailsPasswordService {
private final CustomerCredentials credentials;
UpgradingPasswordService(CustomerCredentials credentials) {
this.credentials = credentials;
}
// Spring Security calls this after a successful login when the stored hash
// uses an older algorithm: the new hash replaces it, no reset needed.
@Override
public UserDetails updatePassword(UserDetails user, String newEncodedPassword) {
credentials.replaceHash(user.getUsername(), newEncodedPassword);
return User.withUserDetails(user).password(newEncodedPassword).build();
}
}

auth/src/main/resources/db/migration/ V3__customer_credentials.sql Tablo: hash'i öneki ve tuzuyla birlikte tek bir sütunda saklar.

auth/src/main/resources/db/migration/V3__customer_credentials.sql
CREATE TABLE customer_credentials (
customer_id UUID PRIMARY KEY,
password_hash VARCHAR(255) NOT NULL, -- "{bcrypt}$2a$12$<salt><hash>": algorithm, cost and salt included
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

Kendini sına

Şimşek turu1/4

Parolalar şifrelenip saklanmalıdır.

Soru 1/3İleri

Eski hash'ler SHA-256, yenileri bcrypt olacak. Kullanıcılar parolalarını yeniden girmeden nasıl geçilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Parola şifrelenmez, hash'lenir: geri çözülemez, girişte yeniden hesaplanıp karşılaştırılır.
  2. 2 Tuz aynı parolaların aynı görünmesini ve hazır tabloları durdurur. Yavaş bir hash her tahmini pahalı yapar.
  3. 3 Yavaş hash zayıf parolayı güçlü yapmaz. Sızmış listelerdeki parolalar kayıtta reddedilir.
Sonraki kapı Müşteri, faturalarının indirileceği adresi yazdı. Sunucu indirdi. İnen dosyada bulut hesabının geçici anahtarları vardı. Nasıl? SSRF — Müşterinin Verdiği Adresi Sunucu Neden Çağırmamalı? · 8 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı