Parola nasıl saklanır
- Parolanın kendisi yerine Argon2id gibi bir parola özetleme algoritmasının çıktısını sakla. Her parola için ayrı tuz kullan. Böylece bir sızıntıdan sonra parola tahmini yapmak daha pahalı hale gelir.
- Argon2id, scrypt ve bcrypt bu iş için yazıldı. OWASP ilk tercih olarak Argon2id önerir.
- Tuzun, biberin ve çalışma faktörünün ne işe yaradığını, kimlik bilgisi doldurmayı loglardan nasıl yakalayacağını görürsün.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Altay Kargo'nun müşteri veritabanı sızdı ve saldırgan kullanıcı tablosunu indirdi. Bundan sonrasını parolaların nasıl saklandığı belirler. Düz metin tuttuysan hesaplar aynı dakika düşer. Hızlı bir özetle sakladıysan yaygın parolalar birkaç saat içinde açılır.
Doğru algoritmayla sakladıysan saldırgan aylarca uğraşır ve güçlü parolaların çoğunu kıramaz. Bu derste parolayı neden şifrelemediğini, hangi algoritmayı hangi ayarla seçeceğini ve tuzun ne işe yaradığını öğrenirsin. Son bölümde de saklama ne kadar iyi olursa olsun, çalınmış parolalarla yapılan saldırıyı nasıl yakalayacağını görürsün.
Şifreleme ve hızlı özet neden yetmez
İlk kural net: düz metin yok. Parolayı şifreleyip saklamak da yanlış yoldur. Şifreleme geri döner ve anahtar çoğunlukla aynı sunucuda durur.
Sunucuyu ele geçiren hem kasayı hem anahtarı alır. OWASP açıkça söyler: parola şifrelenmez, modern ve ayarlanabilir bir özet algoritmasıyla özetlenir. Özetle saklamanın mantığı ilk derstekiyle aynıdır.
Kullanıcı kayıt olurken sunucu parolanın özetini hesaplar ve yalnız özeti yazar. Kullanıcı giriş yaparken sunucu gelen parolanın özetini yeniden hesaplar ve kayıtlı özetle karşılaştırır. Sunucu parolanın kendisini hiç saklamaz.
Burada ikinci tuzak bekler: SHA-256 tek başına yetmez. SHA-256 hızlı çalışsın diye yazıldı ve parola saklamada hız düşmanındır. Saldırgan sızan özeti çözmez, tahmin eder. Sözlükteki her aday parolanın özetini hesaplar ve tablodakiyle karşılaştırır.
Tek ekran kartı saniyede milyarlarca SHA-256 hesaplar. Eski sızıntılardan derlenmiş milyonlarca gerçek parola, sık kullanılan kalıplar ve kurallarla birleşince kısa ve yaygın parolalar dakikalar içinde düşer. Savunmanın amacı bu yüzden her tahmini pahalı kılmaktır. Hesap kullanıcı için girişte bir kez yapılır, saldırgan içinse milyarlarca kez.
KÖTÜ parola -> veritabanı
KÖTÜ aes(parola, K) -> veritabanı (K de aynı sunucuda)
ZAYIF sha256(parola) -> veritabanı (GPU saniyede milyarlarca dener)
DOĞRU argon2id(parola, tuz, bellek=19 MiB, tur=2, paralel=1)
$argon2id$v=19$m=19456,t=2,p=1$<tuz>$<özet>Kod bloğunu yukarıdan aşağı oku. İlk satırda parola olduğu gibi duruyor; sızıntı anında herkes okur. İkinci satırda parola şifreli, ama anahtar aynı sunucuda olduğu için koruma bir kapı kadar ince.
Üçüncü satırda parola geri dönmüyor, ama hızlı özet saldırgana saniyede milyarlarca deneme hakkı veriyor. Son satır doğru yolu gösterir.
Argon2id her deneme için 19 MiB bellek ve iki tur hesap ister. Kaydın kendisi de algoritmanın adını, ayarlarını ve tuzu taşır. Bu ayarların anlamını ve kaydın alanlarını sonraki iki bölümde tek tek açarsın.
Etkinlik 1 / 7
Doğru mu, yanlış mı?
Parolaları AES ile şifreleyip anahtarı aynı sunucuda tutarsan, sunucu ele geçirildiğinde parolalar korunur.
Yavaş algoritmalar ve ayarları
Doğru araçlar kasıtlı olarak yavaştır. bcrypt, scrypt ve Argon2id parola saklamak üzere yazıldı. Üçü de ayarlanabilir bir iş yükü taşır ve buna çalışma faktörü denir.
Faktörü artırdıkça her deneme pahalanır. Kullanıcı girişte bir saniyenin altında bekler ve farkı hissetmez. Saldırganın milyarlarca denemesi ise yıllara yayılır.
Argon2, 2015'te parola özeti algoritmaları için düzenlenen açık bir yarışmayı kazandı, 2021'de de RFC 9106 olarak yayımlandı. Üç türü var: Argon2d, Argon2i ve ikisini birleştiren Argon2id. Parola saklamada Argon2id seçilir.
scrypt ve Argon2id ayrıca bol bellek ister. Ekran kartında binlerce çekirdek var, ama çekirdek başına düşen bellek az. Bellek yoğun algoritma bu yüzden paralel kırmayı frenler.
Saldırgan daha çok çekirdek alsa da her çekirdeğe yeterli belleği veremez. OWASP'ın bugünkü önerisi Argon2id için en az 19 MiB bellek, 2 tur ve 1 paralellik. Aynı güç daha az bellek ve daha çok turla da elde edilir; OWASP birkaç eşdeğer seçenek listeler.
Eski sistemde bcrypt kabul edilir. Çalışma faktörü en az 10 olur ve bcrypt parolanın yalnız ilk 72 baytını işler. FIPS uyumu gereken yerde PBKDF2 kullanılır.
Algoritma Ayar OWASP alt sınırı argon2id m=bellek, t=tur, p=paralellik m=19 MiB, t=2, p=1 scrypt N=maliyet, r=blok, p=paralellik N=2^17 (128 MiB), r=8, p=1 bcrypt maliyet (2^maliyet tur) 10, girdi en çok 72 bayt PBKDF2 yineleme sayısı HMAC-SHA256 ile 600.000
bcrypt'in çalışma faktörü üstel büyür: faktörü bir artırmak işi iki katına çıkarır. Faktörü 10'dan 12'ye çekersen her özet dört kat uzun sürer. Doğru değeri kendi sunucunda ölçerek seçersin. Pratik bir hedef, tek özetin giriş sunucusunda birkaç yüz milisaniyeyi geçmemesidir.
Çok yüksek değer seçersen yoğun saatlerde giriş uç noktası yavaşlar ve saldırgan bunu hizmeti boğmak için kullanabilir. Bu yüzden yavaş özetin yanında giriş uç noktasına hız sınırı da koyarsın. bcrypt'in 72 bayt sınırı da bir tuzaktır, çünkü bazı kütüphaneler fazlasını sessizce keser. Uzun parola cümlelerine yer veriyorsan Argon2id seçersin.
Etkinlik 2 / 7
bcrypt çalışma faktörünü 10'dan 13'e çıkarıyorsun. Tek özetin maliyeti kaç katına çıkar?
Tahminini kaydır, sonra gönder.
Kaydın anatomisi, tuz ve biber
Parola kaydı yalnız özetten ibaret değildir. Algoritmanın adını, sürümünü, ayarlarını ve tuzu da taşır. Giriş anında kod bu satırı okur, aynı ayarlarla parolayı yeniden özetler ve sonucu karşılaştırır.
Ayarlar kayıtta durduğu için faktörü artırdığında eski kayıtlar bozulmaz; her satır kendi ayarıyla doğrulanır. Aynı tabloda farklı ayarlarla yazılmış kayıtlar yan yana yaşayabilir. Aşağıda htpasswd aracıyla üretilmiş bir bcrypt kaydı ve bir uygulamanın veritabanından alınmış bir Argon2id kaydı var. Alanları tek tek ayır.
$ htpasswd -B -C 12 -n ayse New password: Re-type new password: ayse:$2y$12$xjQfmjY7Q8o3INtfWyzgMeGtFBlc2ci8k8T4UqZLm.ggc8yPKQmom $argon2id$v=19$m=19456,t=2,p=1$+pJ4gGYMuKT2syD6Rt3Uzw$47Sx0PSTrSC0AttnCNybtgCRmMcx7lBZh90BkDFEAys
İlk kayıtta $2y$ bcrypt'in sürüm önekidir, 12 ise çalışma faktörüdür. Ardından gelen 22 karakter tuz, kalan 31 karakter özettir; önekle birlikte toplam 60 karakter eder. htpasswd'nin varsayılan faktörü 5'tir ve bugün çok düşüktür, bu yüzden komuttaki -C 12 bayrağı faktörü yükseltir.
İkinci kayıtta $argon2id$ algoritmayı, v=19 ise Argon2'nin 1.3 sürümünü gösterir. m=19456 kibibayt cinsinden bellek miktarıdır ve 19 MiB eder. t=2 tur sayısı, p=1 paralel şerit sayısıdır.
Sonraki iki alan Base64 ile yazılmış tuz ve özettir. Bu ayarlarla tek bir özet sıradan bir dizüstü bilgisayarda birkaç on milisaniye sürer.
Tuz (salt), her kullanıcıya özel rastgele değerdir. Parolanın yanına eklenir ve özet ikisinden birlikte hesaplanır. İki kullanıcı aynı parolayı seçse bile özetleri farklı çıkar. Gökkuşağı tablosu (rainbow table), yaygın parolaların önceden hesaplanmış özet listesidir.
Tuz bu listeyi çöpe atar, çünkü saldırgan her tuz için hesabı baştan yapmak zorunda kalır. Tuz ayrıca bütün tabloya tek seferde saldırmayı engeller. Tuzsuz tabloda saldırgan bir tahmini bir kez özetler ve bütün satırlarla karşılaştırır. Tuzlu tabloda ise her satır için ayrı özet hesaplar.
Tuz gizli değildir, özetin yanında açıkça durur. İşi gizlilik değil, benzersizliktir. Modern kütüphaneler tuzu kendisi üretir ve kayda yazar; tuzu elle üretip herkese aynı değeri vermek sık görülen bir hatadır. Biber (pepper) ise farklıdır: bütün kullanıcılar için ortaktır ve veritabanında durmaz.
Sır kasasında ya da donanım modülünde tutulur, bu yüzden yalnız veritabanı sızarsa saldırganın elinde eksik parça kalır. Biber bir ek katmandır, yavaş algoritmanın yerini tutmaz. Biberi değiştirmek bütün kayıtları etkilediği için bu işi önceden planlarsın.
Etkinlik 3 / 7
Denetimde tabloda $2b$09$ ile başlayan bir kayıt görüyorsun. Bu kayıt için doğru yorum hangisi?
Kaydı okuyabilmek denetimde işine yarar. Bir iç denetimde tabloda farklı önekler görürsen hangi kullanıcının eski ve zayıf ayarla kaldığını hemen anlarsın. Önek $1$ ise kayıt eski MD5 tabanlı crypt biçimindedir.
Önek hiç yoksa ve değer 32 ya da 64 onaltılık karakterse tek turluk hızlı bir özet vardır. İki durumda da o satırlar öncelikli taşınır. Şimdi bildiğin yöntemleri aynı tabloda karşılaştır ve her birini sızıntı anındaki dayanıklılığına göre değerlendir.
Etkinlik 4 / 7
Parola saklama yöntemlerini değerlendir.
Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.
0/6 seçenek yerleşti.
Parola politikası ve kimlik bilgisi doldurma
Parola politikası da değişti. NIST'in 2025'te yayımladığı SP 800-63B-4, tek başına kullanılan parolada en az 15 karakter ister. Parola çok faktörlü doğrulamanın bir parçasıysa alt sınır 8 karakterdir. Kullanıcının en az 64 karakterlik parola yazabilmesi önerilir.
Karakter türü karışımı gibi bileşim kuralları yasaktır, periyodik zorunlu değişim de yasaktır. Parolayı yalnız sızıntı kanıtı varsa değiştirtirsin. Onun yerine yeni parolayı bilinen sızmış, yaygın ve beklenen parolalar listesiyle karşılaştırırsın. Ardışık başarısız denemeleri de hız sınırıyla frenlersin.
Bu kuralların arkasında yılların gözlemi var. Karışım zorunluluğu kullanıcıyı Kargo@2026 gibi tahmin edilebilir kalıplara iter. Periyodik değişim de çoğu zaman aynı parolanın sonundaki rakamı bir artırmakla sonuçlanır. Uzunluk ise kırma maliyetini bu kalıplardan çok daha güçlü artırır.
Kullanıcıya birkaç sözcükten oluşan uzun bir parola cümlesi seçtirirsin. Parola yöneticilerini ve otomatik doldurmayı engellemezsin; NIST bunu açıkça zorunlu tutar. Giriş alanına yapıştırmayı açık bırakman da önerilir, çünkü uzun ve rastgele parolalar çoğu zaman bu yolla girilir.
Derinleş:Sızmış parola kontrolü ve k-anonimlik
Yeni parolayı sızıntı listesiyle karşılaştırmak için listenin tamamını indirmen gerekmez. Yaygın bir hizmet k-anonimlik adlı bir yöntem kullanır. Sunucun parolanın SHA-1 özetini hesaplar ve yalnız ilk beş onaltılık karakterini hizmete yollar. Hizmet, bu beş karakterle başlayan bütün özetlerin geri kalanını ve her birinin kaç sızıntıda görüldüğünü döner.
Bir yanıtta çoğu zaman yüzlerce satır bulunur. Eşleşmeyi senin sunucun yerelde arar. Hizmet hangi parolayı sorduğunu bilemez, çünkü aynı önekle yüzlerce farklı özet döner.
Burada SHA-1 kullanılması çelişki gibi görünebilir. Ama bu bir saklama işi değil, bir arama anahtarıdır; listedeki parolalar zaten herkesin elindedir. Kayıt ve parola değiştirme ekranında bu kontrol bir saniyenin altında biter. Kullanıcıya da parolanın neden reddedildiğini açıkça söylersin.
Etkinlik 5 / 7
Giriş loglarında kimlik bilgisi doldurma saldırısına ait satırları işaretle.
Şüpheli satırlara tıkla. Birden fazla olabilir.
Eski sistemi taşımak ve hesabı korumak
Eski sistemi taşırken bütün kullanıcıları parola sıfırlamaya zorlamazsın. Kullanıcı başarılı giriş yaptığında elindeki düz parolayı yeni algoritmayla yeniden özetler ve eski kaydı değiştirirsin. Kayıttaki algoritma öneki hangi satırın taşındığını gösterir. Aşağıdaki akış bu sessiz taşımayı özetler.
Kod önce kaydın önekine bakar, doğru algoritmayla doğrular. Kayıt eski biçimdeyse ve parola doğruysa aynı anda yeni kaydı yazar. Böylece kullanıcıların çoğu birkaç hafta içinde, hiçbir şey fark etmeden yeni biçime geçer.
giris(kullanici, parola):
kayit = tablo[kullanici]
dogru = dogrula(kayit, parola) # önek algoritmayı seçer
if dogru and kayit.eski_bicimde():
tablo[kullanici] = argon2id(parola) # yeni tuz, güncel ayar
return dogruAkışın bir açığı var: uzun süre giriş yapmayan hesaplar eski ve zayıf özetle beklemeye devam eder. OWASP iki yol önerir. Birincisi bu hesapların parolasını sona erdirip bir sonraki girişte sıfırlama istemektir.
İkincisi eski özeti girdi olarak kullanıp üstüne yavaş algoritmayı sarmaktır. Bu yolda kayıt argon2id(md5(parola)) biçimine geçer ve giriş kodu iki adımı sırayla uygular. Böylece tablonun tamamı tek bir gecede güçlenir, kullanıcıların hiçbirine parola sorulmaz. Kullanıcı daha sonra giriş yaptığında kaydı doğrudan Argon2id ile yeniden yazarsın.
Etkinlik 6 / 7
Geliştirici ekip soruyor: parola saklamayı nasıl düzeltelim? Kısa ve uygulanabilir bir öneri yaz.
Şimdi bakış açını değiştir. Sen parolaları Argon2id ile kusursuz saklıyorsun, ama kullanıcıların parolası başka bir sitenin sızıntısında düz metin olarak dolaşıyor. Kimlik bilgisi doldurmada saldırgan özeti kırmaz, doğru parolayı zaten bilir.
Saldırı çoğu zaman binlerce farklı IP adresine dağılır, bu yüzden tek IP'ye bağlı hız sınırı onu tek başına durdurmaz. Sızmış parola kontrolü yeni parolaları temizler ama eski parolaları yakalamaz. Hangi önlem doğru parolayı bilen birini durdurur?
Etkinlik 7 / 7
Kimlik bilgisi doldurmaya karşı en güçlü savunma hangisidir?
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.
- Etkinlik 1· Şifreleme ve hızlı özet neden yetmez
- Etkinlik 2· Yavaş algoritmalar ve ayarları
- Etkinlik 3· Kaydın anatomisi, tuz ve biber
- Etkinlik 4· Kaydın anatomisi, tuz ve biber
- Etkinlik 5· Parola politikası ve kimlik bilgisi doldurma
- Etkinlik 6· Eski sistemi taşımak ve hesabı korumak
- Etkinlik 7· Eski sistemi taşımak ve hesabı korumak