- Konu sahibi
- #1
Salt, parolaya hash uygulanmadan önce eklenen, her parola kaydı için ayrı ve rastgele üretilen değerdir. Temel amacı, aynı parolaların aynı hash sonucunu üretmesini engellemek ve saldırganın önceden hazırlanmış hash tablolarını doğrudan kullanmasını zorlaştırmaktır. Salt gizli tutulmaz; kullanıcı kaydındaki hash ile birlikte saklanabilir.
Salt kullanılmadığında aynı parola her zaman aynı hash değerini üretir. Böylece saldırgan, ele geçirdiği veritabanında aynı parolayı kullanan hesapları kolayca gruplayabilir veya yaygın parolalar için önceden hesaplanmış sonuçlardan yararlanabilir.
Salt kullanıldığında hesaplama kabaca şu hale gelir:
Buradaki salt her kayıt için farklıdır. Örneğin iki kullanıcının parolası da
Salt, parolayı şifrelemez ve hash değerini geri çevrilemez hale getiren tek unsur değildir. Asıl güvenlik; parola için tasarlanmış, hesaplama maliyeti ayarlanabilen bir KDF veya parola hash algoritması kullanılmasıyla sağlanır. Salt ise her parola için bu hesaplamanın benzersiz olmasını sağlar.
Aynı parolayı kullanan iki hesap düşünün:
İki kayıt da parola ve kendi salt değeri birlikte işlenerek oluşturulur. Saltlar farklı olduğu için hashler de farklı çıkar. Saldırgan bir parolanın hashini tahmin etmek istese bile bunu her kayıt için o kayda ait salt ile yeniden hesaplamak zorundadır. Salt, parolayı bilen bir saldırganın deneme yapmasını imkânsız kılmaz; yalnızca önceden hazırlanmış ortak tabloların ve hash tekrarlarının faydasını azaltır.
Aşağıdaki ayrım, saltın rolünü doğru konumlandırır:
Bu nedenle salt, pepper'ın yerine geçmez; çoğu kurulumda ikisi farklı tehditlere karşı kullanılan ayrı katmanlardır. Saltın amacı gizlilik değil, benzersizliktir.
Modern kütüphaneler saltı çoğunlukla otomatik üretir ve doğrulama biçiminde saklar. PHP password_hash buna örnektir; özel salt seçeneği verilmez, doğrulama password_verify ile yapılır. Kütüphanenin kendisi yönetiyorsa ayrı salt üretip iki kez eklemeyin.
Parola kaydı oluştururken şu sırayı izleyin:
Tek bir sabit salt kullanmak: Bu, tüm kayıtların aynı saltı paylaşmasına neden olur ve kayıtlar arasındaki benzersizliği büyük ölçüde ortadan kaldırır.
Saltı parola gibi gizlemek: Saltın veritabanında hashle birlikte bulunması normaldir. Gizlenmesi gereken değer parola ve varsa pepperdır. Salt sızdı diye hash doğrulaması geçersiz sayılmaz; ancak zayıf veya hızlı bir hash yöntemi kullanılıyorsa saldırgan çevrimdışı tahmin yapmaya devam edebilir.
Saltı şifreleme anahtarı sanmak: Salt, veriyi çözecek gizli anahtar değildir. Parolayı geri getirmez ve tek başına zayıf parolayı güçlü hale getirmez.
Salt var diye hızlı hash kullanmak: Benzersiz salt, parola tahminlerini ortadan kaldırmaz. Ele geçirilmiş bir hash veritabanına karşı saldırgan yine aday parolaları deneyebilir; bu yüzden uygun KDF, güçlü hesaplama parametreleri ve kullanıcıların güçlü parolalar seçmesini destekleyen bir tasarım birlikte değerlendirilmelidir.
Salt nasıl çalışır?
Salt kullanılmadığında aynı parola her zaman aynı hash değerini üretir. Böylece saldırgan, ele geçirdiği veritabanında aynı parolayı kullanan hesapları kolayca gruplayabilir veya yaygın parolalar için önceden hesaplanmış sonuçlardan yararlanabilir.
Salt kullanıldığında hesaplama kabaca şu hale gelir:
hash = KDF(parola, salt, parametreler)Buradaki salt her kayıt için farklıdır. Örneğin iki kullanıcının parolası da
OrnekParola! olsa bile salt değerleri farklıysa elde edilen hash değerleri de farklı olur. Veritabanında genellikle hash sonucu, salt ve hesaplama parametrelerini taşıyan parola doğrulama değeri saklanır; düz parola saklanmaz. Bu şema kendiniz birleştirme algoritması yazmanız için tarif değildir.Salt, parolayı şifrelemez ve hash değerini geri çevrilemez hale getiren tek unsur değildir. Asıl güvenlik; parola için tasarlanmış, hesaplama maliyeti ayarlanabilen bir KDF veya parola hash algoritması kullanılmasıyla sağlanır. Salt ise her parola için bu hesaplamanın benzersiz olmasını sağlar.
Somut örnek
Aynı parolayı kullanan iki hesap düşünün:
Kullanıcı A: parola = OrnekParola!, salt = a1...Kullanıcı B: parola = OrnekParola!, salt = f9...İki kayıt da parola ve kendi salt değeri birlikte işlenerek oluşturulur. Saltlar farklı olduğu için hashler de farklı çıkar. Saldırgan bir parolanın hashini tahmin etmek istese bile bunu her kayıt için o kayda ait salt ile yeniden hesaplamak zorundadır. Salt, parolayı bilen bir saldırganın deneme yapmasını imkânsız kılmaz; yalnızca önceden hazırlanmış ortak tabloların ve hash tekrarlarının faydasını azaltır.
Aşağıdaki ayrım, saltın rolünü doğru konumlandırır:
| Özellik | Salt | Pepper | Parola hash/KDF |
|---|---|---|---|
| Amaç | Her kaydı benzersizleştirmek | Veritabanı dışında ek gizli değer kullanmak | Parolayı maliyetli biçimde işlemek |
| Gizli olması gerekir mi? | Hayır | Evet | Algoritma gizli olmak zorunda değildir |
| Nerede tutulur? | Hash ile birlikte | Ayrı ve korumalı yapılandırmada | Hash çıktısının parçası veya yanında parametre olarak |
Bu nedenle salt, pepper'ın yerine geçmez; çoğu kurulumda ikisi farklı tehditlere karşı kullanılan ayrı katmanlardır. Saltın amacı gizlilik değil, benzersizliktir.
Uygulamada doğru yaklaşım
Modern kütüphaneler saltı çoğunlukla otomatik üretir ve doğrulama biçiminde saklar. PHP password_hash buna örnektir; özel salt seçeneği verilmez, doğrulama password_verify ile yapılır. Kütüphanenin kendisi yönetiyorsa ayrı salt üretip iki kez eklemeyin.
Parola kaydı oluştururken şu sırayı izleyin:
- Parola için genel amaçlı hızlı hash yerine parola doğrulamaya uygun bir KDF veya parola hash algoritması seçin. Uygulamanızın ve kullandığınız kütüphanenin güvenli varsayılanlarını tercih edin.
- Saltı otomatik üreten güvenilir kütüphaneyi tercih edin. Yalnız düşük seviyeli API gerçekten salt istiyorsa her kayıt için kriptografik rastgele salt sağlayın. Saltı sabit, kullanıcı adı gibi tahmin edilebilir veya tüm kullanıcılar için ortak yapmayın.
- Parola ile saltı seçtiğiniz KDF'ye verin ve ortaya çıkan doğrulama değerini, gerekli parametrelerle birlikte saklayın.
- Girişte kütüphanenin doğrulama işlevine girilen parola ile saklı doğrulama değerini verin. Salt/parametre ayrıştırmasını ve güvenli karşılaştırmayı desteklenen API’ye bırakın.
- Başarılı giriş sonrasında eski ve zayıf bir parola hash biçimi tespit ediliyorsa, kullanıcı parolayı yeniden girdiğinde daha güçlü biçime geçiş yapın. Eski hashlerden düz parolayı çıkarmaya çalışmayın.
Sık yapılan hatalar
Tek bir sabit salt kullanmak: Bu, tüm kayıtların aynı saltı paylaşmasına neden olur ve kayıtlar arasındaki benzersizliği büyük ölçüde ortadan kaldırır.
Saltı parola gibi gizlemek: Saltın veritabanında hashle birlikte bulunması normaldir. Gizlenmesi gereken değer parola ve varsa pepperdır. Salt sızdı diye hash doğrulaması geçersiz sayılmaz; ancak zayıf veya hızlı bir hash yöntemi kullanılıyorsa saldırgan çevrimdışı tahmin yapmaya devam edebilir.
Saltı şifreleme anahtarı sanmak: Salt, veriyi çözecek gizli anahtar değildir. Parolayı geri getirmez ve tek başına zayıf parolayı güçlü hale getirmez.
Salt var diye hızlı hash kullanmak: Benzersiz salt, parola tahminlerini ortadan kaldırmaz. Ele geçirilmiş bir hash veritabanına karşı saldırgan yine aday parolaları deneyebilir; bu yüzden uygun KDF, güçlü hesaplama parametreleri ve kullanıcıların güçlü parolalar seçmesini destekleyen bir tasarım birlikte değerlendirilmelidir.