Güncelleme: Tuzun ne olduğunu, gökkuşağı tablosunun ne olduğunu, sözlük saldırısının ne olduğunu veya tuzun amacının ne olduğunu sormadığımı lütfen unutmayın. Sorguluyorum: Kullanıcıların tuz ve karma değerlerini biliyorsanız, şifrelerini hesaplamak oldukça kolay değil mi?
Süreci anlıyorum ve bazı projelerimde kendim uyguluyorum.
s = random salt
storedPassword = sha1(password + s)
Depoladığınız veritabanında:
username | hashed_password | salt
Gördüğüm her tuzlama uygulaması, tuzu şifrenin sonuna veya başlangıcına ekler:
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
Bu nedenle, tuzuna (ha ha) değecek bir hacker tarafından yapılan bir sözlük saldırısı, her bir anahtar kelimeyi yukarıda listelenen ortak kombinasyonlarda depolanan tuzlara karşı çalıştırır.
Elbette yukarıda açıklanan uygulama, temeldeki sorunu gerçekten çözmeden, bilgisayar korsanı için başka bir adım daha ekliyor? Bu sorunu aşmak için ne gibi alternatifler var, yoksa sorunu yanlış mı anlıyorum?
Yapmayı düşünebildiğim tek şey, tuz ve şifreyi rastgele bir düzende birbirine bağlayan veya karma işlemine başka kullanıcı alanları ekleyen gizli bir karıştırma algoritmasına sahip olmaktır; bu, bilgisayar korsanının veritabanına ve dantel için koda erişmesi gerektiği anlamına gelir. bir sözlük saldırısının verimli olduğunu kanıtlamak için. (Güncelleme, yorumlarda belirtildiği gibi, bilgisayar korsanının tüm bilgilerinize erişebileceğini varsaymak en iyisidir, bu yüzden muhtemelen en iyisi bu değildir).
Bir bilgisayar korsanının bir kullanıcı veritabanını bir şifre ve karma listesiyle nasıl hackleyeceğini önerdiğime bir örnek vereyim:
Saldırıya uğramış veritabanımızdaki veriler:
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
Ortak şifre sözlüğü:
Common Password
--------------
letmein
12345
...
Her kullanıcı kaydı için ortak şifreleri döngüye alın ve hashing yapın:
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next
Umarım bu benim açımdan çok daha iyi anlaşır.
10.000 ortak şifre ve 10.000 kullanıcı kaydı göz önüne alındığında, olabildiğince çok kullanıcı şifresini keşfetmek için 100.000.000 karma hesaplamamız gerekir. Birkaç saat sürebilir, ancak bu gerçekten bir sorun değil.
Çatlama Teorisi Üzerine Güncelleme
SHA1 karma ve tuzlarından oluşan bir veritabanına ve bunları harmanlamak için kullandığınız algoritmaya erişen bozuk bir web barındırıcısı olduğumuzu varsayacağız. Veritabanında 10.000 kullanıcı kaydı bulunmaktadır.
Bu site , GPU'yu kullanarak saniyede 2.300.000.000 SHA1 karmasını hesaplayabildiğini iddia ediyor. (Gerçek dünyada durum muhtemelen daha yavaş olacaktır, ancak şimdilik bu alıntılanan rakamı kullanacağız).
(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 saniye
Maksimum 4 karakter uzunluğunda, hesaplama oranına (değişken) bölünen 95 yazdırılabilir ASCII karakterlik bir dizi göz önüne alındığında, 2'ye bölünür (ortalama şifre keşfetme süresinin ortalama olarak% 50 permütasyon gerektireceği varsayılırsa) 10.000 uzunluğu <= 4 olan kullanıcıların tüm kullanıcı şifrelerini hesaplaması 177 saniye sürer.
Gerçekçilik için biraz ayarlayalım.
(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 gün
Şifre uzunluğu <= 7 olan, büyük / küçük harf duyarlılığı olmadığı varsayılırsa, 10.000 kullanıcı kaydını çözmek 4 gün sürer ve genel ve ideal olmayan durumu yansıtmak için algoritmanın hızını yarıya indirdim.
Bunun doğrusal bir kaba kuvvet saldırısı olduğunu, tüm hesaplamaların birbirinden bağımsız olduğunu ve bu nedenle birden fazla sistemin çözmesi için mükemmel bir görev olduğunu kabul etmek önemlidir. (IE, yürütme süresinin yarısı kadar farklı uçlardan saldırı çalıştıran 2 bilgisayar kurması kolaydır).
Bu görevi hesaplama açısından daha pahalı hale getirmek için bir parolaya 1000 kez yinelemeli hashing uygulandığında:
(((36 ^ 7) / 1000000000) / 2) * 1000 saniye = 10,8839117 saat
Bu, bir kullanıcı için alıntılanan rakamın yarısından daha düşük bir hızda maksimum 7 alfasayısal karakter uzunluğunu temsil eder. .
Yinelemeli olarak 1000 kez karma oluşturma, bir örtülü saldırıyı etkili bir şekilde engeller, ancak kullanıcı verilerine yönelik hedeflenen saldırılar yine de savunmasızdır.