Genel olarak, birden fazla karma algoritması kullanmanıza gerek yoktur.
Yapmanız gereken şey:
Tuz kullanın: Tuz sadece şifrenizi daha güvenli hale getirmek için kullanılmaz, gökkuşağı masa saldırısını önlemek için kullanılır. Bu şekilde, birisinin sisteminizde sakladığınız şifreler için karma hesaplamayı yapmaya çalışmak daha zor olacaktır.
Çoklu etkileşimler kullanın: sadece SHA (parola + tuz) yapmak yerine, SHA (SHA (SHA (SHA (SHA (... SHA (parola + tuz)))))) yapın. Veya, başka bir şekilde temsil etmek için:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
Ve son olarak, iyi bir karma işlevi seçin. SHA, MD5, vb. İyi değil çünkü çok hızlılar . Koruma için karma kullanmak istediğinizden, daha yavaş karma kullanmanız daha iyi olur. Örneğin, Bcrypt , PBKDF2 veya Scrypt'a bir göz atın .
düzenleme : gözlemlerden sonra, bazı noktaları görmeye çalışalım (üzgünüz, sona ulaşmak için uzun bir açıklama, çünkü diğerlerinin benzer cevapları aramasına yardımcı olabilir):
Sisteminiz güvenliyse, hiç kimse hiç bir zaman depolanan şifreye erişemez gibi, hash gerekmez. Şifre gizli olurdu, kimse almadı.
Ancak hiç kimse şifreli veritabanının çalınacağını garanti edemez. Veritabanını çal, tüm şifreleri al. Tamam, sisteminiz ve şirketiniz tüm sonuçlarına katlanacak. Böylece, bu parolanın sızmasını önlemeye çalışabiliriz.
UYARI Bu noktaya online saldırılarla ilgili endişeli olmadığını. Bir çevrimiçi saldırı için, en iyi çözüm kötü şifrelerden sonra yavaşlamak, bazı denemelerden sonra hesabı kilitlemektir. Ve bunun için şifrenizi, hash, mağaza vb. Şifrenizi hangi şekilde şifrelemeniz önemli değildir. Çevrimiçi saldırı, şifre girişlerini yavaşlatma sorunudur .
Öyleyse don't let them take my plain passwords
soruna geri dönelim . Cevap basit: onları düz metin olarak saklamayın. Tamam anladım.
Bundan nasıl kaçınılır?
Şifreyi şifreleyin (?). Ancak, bildiğiniz gibi, eğer şifrelerseniz, uygun anahtarınız varsa, şifresini tekrar çözebilirsiniz. Ve anahtarı "nereye saklayacağınız" problemi ile başlayacaksınız. Hum, hayır, hayır, sana veritabanı aldıklarından, anahtarını alabilirler. Tamam, hadi kullanmayalım.
Öyleyse başka bir yaklaşım: Şifreyi ters çevrilemeyecek başka bir şeye dönüştürelim ve saklayalım. Verilen parolanın doğru olup olmadığını doğrulamak için aynı işlemi tekrar yaparız ve değiştirilmiş iki değerin aynı olup olmadığını kontrol ederiz. Eşleşirlerse = iyi şifre verildi.
Tamam, çok iyi. Şifrede biraz MD5 karma kullanalım. Ama ... eğer birileri saklanmış bir parola değerine sahipse, olası her parolanın (kaba kuvvet) MD5 değerini hesaplamak için çok fazla bilgisayar gücüne sahip olabilir, böylece orijinal parolayı bulabilir. Ya da en kötüsü, tüm MD5'i tüm karakter kombinasyonlarından saklayabilir ve şifreyi kolayca bulabilir. Bu yüzden, daha fazla zaman alacağından, HASH (HASH (HASH ())) işi çok fazla yineleme yapın.
Ancak bu bile çevrelenebilir, bu tür bir korumaya karşı hız kesmek için gökkuşağı masası tam olarak yaratıldı.
Öyleyse üzerinde biraz tuz kullanalım. Bu şekilde, her etkileşimde, tuz tekrar kullanılır. Şifrelerinize saldırmaya çalışan biri tuzun her seferinde eklendiğini düşünerek gökkuşağı masasını oluşturmak zorunda kalacak. Ve o gökkuşağı masasını ürettiğinde, bir tuzla üretildiği için, diğer tuzla tekrar hesaplaması gerekecek, böylece her bir parola için biraz zaman harcayacaktır (= her bir tuz). Tuz, şifreye "daha fazla karmaşıklık" eklemeyecek, her şifre için bir tuz kullanıyorsanız, saldırganın gökkuşağı tablosunu oluştururken serbest zaman geçirmesini sağlar, her bir şifre için bir tuz kullanırsanız, bir tuzdan gelen tablo başka bir şifre için kullanışsızdır.
Ve birden fazla karma kullanmak burada yardımcı olacak mı? Hayır. Belirli bir gökkuşağı saldırısı yapan kişi, yine de bir veya daha fazla karma kullanarak onu üretebilecek.
Birden fazla karma kullanmak sizi bir soruna götürebilir: kullandığınız en zayıf karma kadar güvenli. Birisi bir karma algoritmada çarpışmalar bulursa, yineleme işleminin herhangi bir yerinde şifreyi kırmak için kullanılacak karmadır. Yani, daha fazla karma algoritması kullanarak hiçbir şey kazanmazsınız, sadece bir iyi algo seçmek daha iyidir. ve kullan. Ve eğer yuo kırıldığını duyarsa, uygulamanızda nasıl değiştireceğinizi düşünün.
Ve neden bcrypt veya buna benzer bir şey kullanmalısınız (kullandığınızı söylüyorsunuz): çünkü saldırgan tabloları oluşturmak için daha fazla zaman harcamak zorunda kalacak. Bu yüzden MD5 + wait (3 saniye) komutunun kullanılması yardımcı olmuyor: saldırı zaten çevrimdışı olacak, böylece saldırgan tabloları (3 saniye gecikmeden) oluşturabilecektir.