Tuzlar neden sözlük saldırılarını 'imkansız' kılıyor?


85

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.


12
Tuzlamadaki tüm nokta, karma şifreye bakmanızı ve birden fazla kullanıcının aynı karma (ve dolayısıyla aynı şifre) olduğunu görmenizi engellemektir. Tuzlama yapmadan, sadece hash algoritmasını kullanabilir ve olası her hash'i üretebilir ve ardından bu hash için kaba bir arama yapabilirsiniz. Algoritma asla değişmediğinden saldırganlar için öngörülebilir kılar, tuzlama onu çok daha zor hale getirir.
BeRecursive

25
Çünkü krakerler sümüklü böcek gibidir ve tuz derilerindeki mukozayı kurutup öldürür.
TED

6
@TED: Tuzlu krakerleri severim. Tuzlu sümüklü böcek, pek değil.
FrustratedWithFormsDesigner

3
@Tom - sizin örnek saldırınızda. Tuz yoksa, saldırgan "her ortak şifre için şifreyi karıştırabilir. Bu bir veya daha fazla kullanıcıyla eşleşiyor mu? Evet, şifreleri bende" - saldırgan tüm şifrelere "paralel olarak" saldırabilir , hiçbir ekstra ücret ödemeden.
Damien_The_Unbeliever

3
@Tom Gullen - resmin sadece yarısına sahipsiniz. Tuz olmadan, bir saldırgan "Güncelleme 2" de gösterdiğiniz yöntemi kullanmaz. Bir tabloda bir arama yapar ve şifreyi O (1) veya O (log n) zamanında (n, aday şifre sayısıdır) alırdı. Tuz bunu engelleyen ve gösterdiğiniz O (n) yaklaşımını kullanmaya zorlayan şeydir. Başka bir teknik (anahtar güçlendirme), döngünüzdeki her denemenin tam bir saniye sürmesine neden olabilir, yani bu testleri gerçekleştirmek 3 yıl sürecektir ... zaman.
erickson

Yanıtlar:


31

Evet, sha1 (salt | password) için sadece 3 güne ihtiyacınız var. Bu nedenle iyi parola depolama algoritmaları 1000 yinelemeli karma kullanır: 8 yıla ihtiyacınız olacak.


3
+1, en kısa ve öz yanıt şu ana kadar bunun bir seçenek olduğunu bilmiyordum.
Tom Gullen

Görünüşe göre sisteminizde bir hash karşılaştırması yapmadınız. Saniyede MİLYONLARCA sha1 hesaplaması yapabilirsiniz . 1000 mermi bir saldırgan için anlamsızdır. Ayrıca -1 çünkü sha1 bozuk bir hash fonksiyonudur.
kale

Görünüşe göre sorudaki isimleri ve numaraları kullanıyorum. Konu ve netlik diye bir şey duyduysanız ... ah, bu Rook. Boşver.
blaze

1
@Rook, 1.000 mermi, kaba kuvvetin 1.000 kat daha uzun süreceği anlamına gelir. Bana iyi bir özellik gibi görünüyor.
Tom Gullen

bir saldırgan bir şifreyi tahmin edebiliyorsa, bu giriş için aynı mıdır (veya bana kaçan bir şey mi? lol)
khaled_webdev

62

Sözlük saldırılarını durdurmaz.

Yaptığı şey, parola dosyanızın bir kopyasını almayı başaran birinin , şifrelerin karmalardan ne olduğunu anlamak için gökkuşağı tablosu kullanmasını engellemektir.

Sonunda, yine de kaba kuvvetle zorlanabilir. Bu bölümün cevabı, kullanıcılarınızı sözlük kelimelerini şifre olarak kullanmamaya zorlamaktır (örneğin, en az bir sayı veya özel karakter için minimum gereksinimler).

Güncelleme :

Bundan daha önce bahsetmeliydim, ancak bazı (çoğu?) Şifre sistemleri her şifre için farklı bir şifre kullanıyor ve muhtemelen şifrenin kendisiyle birlikte saklanıyor. Bu, tek bir gökkuşağı masasını işe yaramaz hale getirir. UNIX şifreleme kitaplığı böyle çalışır ve modern UNIX benzeri işletim sistemleri bu kitaplığı yeni karma algoritmalarla genişletmiştir.

GNU şifresinin daha yeni sürümlerine SHA-256 ve SHA-512 desteğinin eklendiğini biliyorum.


17
+1 Tuz, önceden hesaplanmış karma listelerinin (gökkuşağı tabloları) kullanışlı olmasını engeller. Saldırgan her şeye yeniden başlamalıdır.
Ian Boyd

2
PHP'de, md5 veya sha1'den daha iyi şifreleme için mcrypt veya bcrypt kitaplıklarını kullanabilirsiniz. Eğer md5 veya sha1 ile sıkışıp kaldıysanız, veritabanında depolanan şeye ulaşmadan önce şifreyi 1000 kez hash ettiğiniz 'germe' yapmanız gerekir. Bu, entropiyi aynı tutar, ancak hash'i hesaplama süresini uzatır.
Malfist

2
@Tom Gullen, hangi yazıları okuyorsun? Kendini kanıtlamış uzmanlar veya bilimsel bir dergide hakemli makaleler mi?
Malfist

7
Ve "güvenli" bir sistemin nasıl yazılacağına dair bu blog / yardım gönderilerini yapan ortalama Joe geliştiricinizdir. Güvenlik, yan taraftan anlayabileceğiniz bir şey değildir, kapsamlı bilgi gerektirir. Haksız mı? Muhtemelen. Güvenli mi? Bir dereceye kadar. Güvenlik uzmanlarının olmasının nedenleri var. Ama yine de, her şeyin Fort Knox kadar güvenli olması gerekmiyor. Buradaki en iyi politika, bu uzmanlar tarafından tasarlanmış önceden oluşturulmuş bir sistemi kullanmak ve bunu ihtiyaçlarınızı karşılayacak şekilde değiştirmektir.
Malfist

3
@Michael: Daha uzun bir tuzla, gökkuşağı tablosunda görünmesi için tüm olası tuz değerlerini önceden hesaplamanız gerekir. Önemli olan, tüm şifreler için aynı tuzu tutmamanız, her şifre için rastgele seçmeniz ve şifrelenmiş şifrelenmiş şifrenin yanındaki veritabanında saklamanızdır. Bu nedenle, bir bilgisayar korsanı, olası her büyük değerli tuz için gökkuşağı tablosuna bir girişe ihtiyaç duyacaktır, bu da masanın mümkün olamayacak kadar büyük olmasına neden olur, bu da önemli noktadır.
Colin declue

31

Daha kesin olmak gerekirse, bir sözlük saldırısı , yani kapsamlı bir listedeki tüm kelimelerin denendiği bir saldırı "imkansız" olmaz, ancak pratik olmaz : her bir tuz parçası, gereken depolama ve hesaplama miktarını ikiye katlar .

Bu, tuzun gizli olup olmadığının önemli olmadığı gökkuşağı tablolarını içeren saldırılar gibi önceden hesaplanmış sözlük saldırılarından farklıdır.

Örnek: 64 bitlik bir tuzla (yani 8 bayt) , sözlük saldırınızda 2 64 ek şifre kombinasyonunu kontrol etmeniz gerekir . 200.000 kelimeden oluşan bir sözlük ile yapmanız gerekecek

200.000 * 2 64 = 3.69 * 10 24

en kötü durumda test - tuzsuz 200.000 test yerine.

Salt kullanmanın ek bir yararı da, bir saldırganın parola karmalarını sözlüğünden önceden hesaplayamamasıdır. Çok fazla zaman ve / veya alan gerektirir.

Güncelleme

Güncellemeniz, bir saldırganın tuzu zaten bildiğini (veya çaldığını) varsayar. Bu elbette farklı bir durum. Yine de saldırganın önceden hesaplanmış bir gökkuşağı tablosu kullanması mümkün değildir. Burada çok önemli olan, hashing fonksiyonunun hızıdır. Bir saldırıyı uygulanamaz hale getirmek için, karma işlevinin yavaş olması gerekir. MD5 veya SHA burada iyi adaylar değil çünkü hızlı olacak şekilde tasarlandılar, karma algoritmalar için daha iyi adaylar Blowfish veya bazı varyasyonları.

Güncelleme 2

Genel olarak parola karmalarınızın güvenliğini sağlama konusunda iyi bir okuma (orijinal sorunun çok ötesine geçmesine rağmen yine de ilginç):

Rainbow Tabloları Yeterince: Güvenli Şifre Planları Hakkında Bilmeniz Gerekenler

Makalenin doğal sonucu: Karma oluşturmayı yavaşlatmak için yapılandırılabilir bir kurulum süresi kullanmanıza izin veren , bcrypt (Blowfish'e dayalı) veya Eksblowfish ile oluşturulmuş tuzlu karmalar kullanın .


4
@Tom Gullen - makul güçlü parola politikaları olsa bile, yüz milyonlarca veya birkaç milyar adayın sözlüğünde isabet alma olasılığı yüksektir, çünkü tüm parolalar eşit derecede olası değildir (çünkü insanlar bunları seçmek için RNG yerine anımsatıcı kullanır) . Bu boyuttaki bir sözlük olan tuz kullanılmadığı takdirde emtia sistemlerinde precomputable. Tuz kullanılıyorsa, saldırganın her seferinde hash'leri yeniden hesaplaması gerekir ve hash için yeterli sayıda yineleme yapılırsa, saldırganın saldırı hızı saniyede birkaç denemeye düşebilir.
erickson

3
-1 benden: sır olarak saklanmak tamamen tuzların amacı değil. Parolaları kontrol etmek için yine de erişilebilir olmalarına ihtiyacınız var, bu nedenle onları gizli tutmaya yönelik herhangi bir girişim, sistemi gerçekten başarılı olmaktan ziyade ek karmaşıklık yoluyla daha savunmasız hale getirecektir.
Michael Borgwardt

2
@ 0xA3: yine: bir saldırgan tarafından bilinmemesi tuzun amacı değildir . Makinenizin bir şekilde ona erişmesi gerekiyor, böylece makineye giren bir saldırgan da onu alabilir. Saldırganın tuzu bilmediği herhangi bir senaryo kırmızı ringa balığıdır.
Michael Borgwardt

1
Bağlantılı makalenin gökkuşağı tablolarını yanlış tanımladığını belirtmeye değer olduğunu düşünüyorum. Açıkladığı şey basit bir sözlük ekidir. Gökkuşağı masaları gerçekten oldukça farklı (ve biraz daha karmaşık). Gökkuşağı masalarının gerçekte nasıl çalıştığına dair oldukça iyi bir açıklama var : kestas.kuliukas.com/RainbowTables
Jerry Coffin

3
"Tabii ki tuzun gizli tutulması gerekiyor" için -1. Bir saldırganın parola karmalarınıza erişimi varsa, sizin tuzlarınıza da sahip olacaktır - ihtiyacınız olan şey kullanıcı başına tuzlardır, "gizli" bir tuzun belirsizliği yoluyla sağlanan güvenlik değil.
snemarch

17

Sözlük, değerlerin anahtarlar tarafından indekslendiği bir yapıdır. Önceden hesaplanmış sözlük saldırısı durumunda, her anahtar bir karmadır ve karşılık gelen değer, karma ile sonuçlanan bir paroladır. Elinde önceden hesaplanmış bir sözlükle, bir saldırgan oturum açmak için gerekli karmayı üretecek bir parolayı "anında" arayabilir.

Tuzla, sözlüğü saklamak için gereken alan hızla büyür… o kadar hızlı ki, bir şifre sözlüğünü önceden hesaplamaya çalışmak kısa sürede anlamsız hale gelir.

En iyi tuzlar, bir kriptografik rasgele sayı üretecinden rasgele seçilir. Sekiz bayt pratik bir boyuttur ve 16 bayttan fazlası hiçbir amaca hizmet etmez.


Tuz, "saldırganın işini daha sinir bozucu hale getirmekten" çok daha fazlasını yapar. Önceden hesaplanmış sözlüklerin kullanımı gibi tüm bir saldırı sınıfını ortadan kaldırır.

Şifreleri tamamen güvence altına almak için başka bir unsur gereklidir ve bu da "anahtar güçlendirme" dir. Bir tur SHA-1 yeterince iyi değildir: Güvenli bir şifre karma algoritması hesaplama açısından çok yavaş olmalıdır .

Birçok kişi, sonuçları binlerce kez karma işlevine geri besleyen anahtar türetme işlevi olan PBKDF2'yi kullanır . "Bcrypt" algoritması, yavaş olan yinelemeli bir anahtar türetme kullanarak benzerdir.

Hashing işlemi çok yavaş olduğunda, önceden hesaplanmış bir tablo bir saldırgan için gittikçe daha cazip hale gelir. Ancak uygun tuz, bu yaklaşımı bozar.


Yorumlar

Soruya yaptığım yorumlar aşağıdadır.


Tuz olmadan, saldırgan "Güncelleme 2" de gösterilen yöntemi kullanmaz. Önceden hesaplanmış bir tabloda bir arama yapar ve şifreyi O (1) veya O (log n) zamanında (n, aday şifre sayısıdır) alırdı. Tuz bunu engelleyen ve onu "Güncelleme 2" de gösterilen O (n) yaklaşımını kullanmaya zorlayan şeydir.

Bir O (n) atağına düştükten sonra, her denemenin ne kadar süreceğini düşünmemiz gerekir. Anahtar güçlendirme, döngüdeki her denemenin tam bir saniye sürmesine neden olabilir, yani 10.000 kullanıcı üzerinde 10.000 parolayı test etmek için gereken süre 3 günden 3 yıla kadar uzayacaktır ... ve yalnızca 10.000 parolayla sıfırlama olasılığınız yüksektir. o zamandaki şifreler.

Bir saldırganın, PHP'yi değil, kullanabileceği en hızlı araçları kullanacağını göz önünde bulundurmalısınız, bu nedenle, anahtar güçlendirme için 100 yerine binlerce yineleme iyi bir parametre olacaktır. Tek bir parola için karmanın hesaplanması saniyenin büyük bir kısmını almalıdır.

Anahtar güçlendirme, harika parola gizleme algoritmaları oluşturan ("türetilmiş anahtar" "karma" dır), PKCS # 5'ten standart anahtar türetme algoritmaları PBKDF1 ve PBKDF2'nin bir parçasıdır.

StackOverflow'daki pek çok kullanıcı, Jeff Atwood'un gökkuşağı tablolarının tehlikeleri hakkındaki gönderisine bir yanıt olduğu için bu makaleye atıfta bulunuyor. En sevdiğim makale değil, ancak bu kavramları daha ayrıntılı olarak tartışıyor.


Elbette saldırganın her şeye sahip olduğunu varsayarsınız: salt, karma, kullanıcı adı. Saldırganın, kullanıcı tablosunu myprettypony.com fan sitenize bırakan bozuk bir barındırma şirketi çalışanı olduğunu varsayın. Bu şifreleri kurtarmaya çalışıyor çünkü geri dönecek ve midilli hayranlarınızın citibank.com hesaplarında aynı şifreyi kullanıp kullanmadıklarını görecek.

İyi tasarlanmış bir parola şemasıyla, bu adamın herhangi bir parolayı kurtarması imkansız olacaktır .


1
Tom'un "sözlük saldırısı" derken, önceden hesaplanmış karma düz metin tabloları değil, bilinen zayıf parolaları denemekten (yani doğrudan bir insan dili sözlüğünden) bahsettiğini düşünüyorum - bu aynı zamanda bu bağlam.
Michael Borgwardt

@Michael Borgwardt: Kabul ediyorum, @erickson önceden hesaplanmış sözlük saldırılarını ifade ediyor.
Dirk Vollmar

1
Salt, önceden hesaplanmış sözlük saldırılarını durdurur. Anahtar güçlendirme, sözlük saldırılarını durdurur. Güvenli parola doğrulaması için her ikisi birlikte kullanılmalıdır.
erickson

Evet, düz ingilizce tabloları kastediyorum. Soru, bir bilgisayar korsanının her kullanıcı hesabı için tüm olası karma kombinasyonlarını çalıştırmasını nasıl durduracağı sorununu çözmeyi hedefliyor
Tom Gullen,

7

Tuzlamanın amacı, saldırganın çabasının amortismanını önlemektir.

Tuz içermeyen, tek bir önceden hesaplanmış karma şifre girişleri tablosu (örn. Tüm alfasayısal 5 karakter dizilerinin MD5'i, çevrimiçi bulunması kolay) dünyadaki her veritabanındaki her kullanıcı için kullanılabilir.

Siteye özgü bir tuzla, saldırganın tabloyu kendisi hesaplaması gerekir ve ardından sitenin tüm kullanıcıları üzerinde kullanabilir.

Kullanıcı başına tuz ile, saldırgan bu çabayı her kullanıcı için ayrı ayrı harcamalıdır.

Elbette, bu gerçekten zayıf parolaları doğrudan bir sözlükten korumak için fazla bir şey yapmaz, ancak oldukça güçlü parolaları bu amortismana karşı korur.


1
Kısa ve kesin cevap - tuz olmadan veya site çapında tuzla, kullanıcıları aynı şifreyle kolayca tespit edebilirsiniz ve yalnızca birini kaba kuvvetle zorlamanız gerekeceğini eklemeye değer. Kullanıcı başına tuzlarla bunu yapamazsınız.
snemarch

6

Ayrıca - bir önemli nokta daha - KULLANICI'ya özgü bir tuz kullanmak, AYNI şifresine sahip iki kullanıcının tespitini engeller - karmaları eşleşir. Bu yüzden çoğu zaman karma hash'dir (salt + kullanıcı adı + şifre)

Hash'i gizli tutmaya çalışırsanız, saldırgan hash'leri de doğrulayamaz.

Düzenleme - az önce ana noktanın yukarıdaki bir yorumda belirtildiğini fark ettim.


1
Kullanıcı başına tuz belirtmek için düzenlemelisiniz; site genelinde tuz kullanan siteler, aynı parolaları tespit etmenize yine de izin verecektir.
snemarch

@snemarch - Evet- bu önemli ayrım için çok teşekkür ederim!
Dominik Weber

5

Gökkuşağı sofra saldırılarını önlemek için tuzlar uygulanır. Gökkuşağı tablosu, bir hash'i kendi ifadesine çevirmeyi çok daha basit hale getiren önceden hesaplanmış hash'lerin bir listesidir. Modern bir hashing algoritmamız yoksa, tuzlamanın bir şifre kırmaya yönelik modern bir önleme olarak etkili olmadığını anlamanız gerekir.

Diyelim ki SHA1 ile çalışıyoruz, bu algo ile keşfedilen son açıklardan yararlanıyoruz ve diyelim ki 1.000.000 karma / saniyede çalışan bir bilgisayarımız var, çarpışmayı bulmak 5.3 milyon milyon milyon yıl alacak , yani evet php saniyede 300 çalışabilir, büyük woop, gerçekten önemli değil. Tuzluyor olmamızın nedeni, birisinin tüm yaygın sözlük cümlelerini üretme zahmetine girmesidir (2 ^ 160 kişi, 2007 dönemi istismarlarına hoş geldiniz).

İşte test ve yönetici amacıyla kullandığım 2 kullanıcıyla gerçek bir veritabanı.

RegistrationTime        UserName        UserPass    
1280185359.365591       briang      a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087       test        5872548f2abfef8cb729cac14bc979462798d023

Aslında, tuzlama şeması sha1'inizdir (kayıt zamanı + kullanıcı adı). Devam et, bana şifremi söyle, bunlar üretimdeki gerçek şifreler. Hatta orada oturup php'de bir kelime listesi oluşturabilirsiniz. Vahşileş.

Deli değilim, bunun güvenli olduğunu biliyorum. Eğlence uğruna testin şifresitest . sha1(sha1(1281546174.065087 + test) + test) = 5872548f2abfef8cb729cac14bc979462798d023

Sadece bu kullanıcı 27662aee8eee1cb5ab4917b09bdba31d091ab732için tam bir gökkuşağı tablosu oluşturmanız gerekir . Bu, aslında parolalarımın tek bir gökkuşağı tablosu tarafından tehlikeye atılmamasına izin verebileceğim anlamına geliyor, bilgisayar korsanının test için 27662aee8eee1cb5ab4917b09bdba31d091ab732 ve yine f3f7735311217529f2e020468004a2aa5b3dee7f için eksiksiz bir gökkuşağı tablosu oluşturması gerekiyor. Tüm karmalar için 5,3 milyon milyon yıla geri dönün. Sadece 2 ^ 80 karma depolamanın boyutunu düşünün (bu 20 yottabayttan fazladır ), bu olmayacak.

Tuzlamayı asla çözemeyeceğiniz bir hash yapmanın bir yolu olarak karıştırmayın, bu gökkuşağı tablosunun tüm kullanıcı şifrelerinizi çevirmesini engellemenin bir yoludur . Bu teknoloji düzeyinde imkansızdır.


Gökkuşağı masasının ne olduğunu anlıyorum, ama sorumun ana fikrini kaçırıyorsunuz. Bana tuzlama algoritmanızı, karma bir şifre ve tuz sağladıysanız, evet muhtemelen şifrenizin ne olduğunu birkaç dakika içinde söyleyebilirim.
Tom Gullen

Paranı ağzının olduğu yere mi koyacaksın?
Incognito

Elbette, ama az önce bana örneğinizdeki şifrenin ne olduğunu söylediniz, bana bir tuz, karma şifre verin ve salt + şifreyi (özyinelemeli değil) ve şifre <= 5 küçük harf alfanümerik karakter (boşluk yok / özel karakterler) Bu kutuda ne olduğunu size bildireceğim. Önerdiğiniz gibi üzerine para koymamı istiyorsanız, bana bildirin, ancak birkaç dakikalık yorumum muhtemelen büyük bir eksik tahmin, ancak saatler içinde evet.
Tom Gullen

1
Aslında saniyeler olabilir, "saniyede 2300M / s SHA1 hashleri" olarak hesaplamak için GPU kullanan golubev.com/hashgpu.htm adresine bakın . 1-6 karakter arasında değişen tam 95 ASCII karakter aralığı ile 6 dakikadan kısa sürede kırabiliriz. Sadece küçük harf alfanümerik karakterlerimiz varsa, 8 karakter uzunluğunda <25 dakika. 10.000 kullanıcı kaydı veritabanıyla, 4 karakterli tam ASCII şifrelerinin tümünü <200 saniyede (((95 ^ 4) / 2300000000) / 2) * 10000) bulabiliriz. (Belirtilenden daha fazla ek yük ve alıntılanan GPU hızları muhtemelen ideal durumlardır).
Tom Gullen

Evet, tuzlama, bu şifreyi zorlayabilmenizi engellemez. Kullanıcıların yaklaşık 10 karakterlik şifreleri varsa ((10 ^ 5) * (94 ^ 10)) = 10 ^ 24 oluşturmanızı zorlaştırır; bu, karma içermeyen 10 ^ 19'dan çok daha zordur. Yine, bir parolayı kırmayı zorlaştırmak değil, önceden işlenmiş bir gökkuşağı tablosu ile tüm parolaları kırmayı olanaksız kılmaktır. (ve burada matematiğimi kontrol edin, ancak herkesin şifresi için 10 ^ 25/2300000000/60/60/24/365/1000 = 137 869 ~ milinea olduğuna inanıyorum). Daha güçlü şifreler istiyorsak, onları tuzlamıyoruz, Diffie-Hellman anahtar değişimi gibi şeyler kullanıyoruz.
Incognito

3

Sözlük saldırısının arkasındaki fikir, bir karma almanız ve bu karmanın hesaplandığı şifreyi, karma hesaplama olmadan bulmanızdır . Şimdi aynısını tuzlu parola için yapın - yapamazsınız.

Salt kullanmamak, şifre aramasını veritabanında aramak kadar kolaylaştırır. Bir tuz eklemek, saldırganın olası tüm şifrelerin karma hesaplamasını gerçekleştirmesini sağlar (sözlüğe ekleme için bile bu, saldırı süresini önemli ölçüde artırır).


OP'nin senaryosunda, saldırgan veri tabanından tuzlara sahiptir ve "sözlükteki" her girişte her tuzu denemek zorunda kalacaktır. ...Bence.
FrustratedWithFormsDesigner

2

En basit terimlerle: tuzlama olmadan, her bir aday şifrenin şifresinin aynı algoritma aracılığıyla karma hale getirildiği "bilinen evrende" (ele geçirilmiş veri tabanları koleksiyonu) herhangi bir yerde her kullanıcıya karşı kontrol edilmesi için yalnızca bir kez karma hale getirilmesi gerekir. Tuzlamada, olası tuz değerlerinin sayısı "bilinen evrendeki" kullanıcı sayısını önemli ölçüde aşarsa, her aday şifrenin test edileceği her kullanıcı için ayrı ayrı hashinglenmesi gerekir.


2

Basitçe söylemek gerekirse, tuzlama bir hash'in saldırıdan (bruteforce veya sözlük) engellemez, sadece onu zorlaştırır; Saldırganın ya tuzlama algoritmasını bulması (ki bu doğru şekilde uygulanırsa daha fazla yinelemeden yararlanacaktır) ya da algoya kaba kuvvet uygulamalıdır ki bu çok basit olmadığı sürece neredeyse imkansızdır. Tuzlama ayrıca gökkuşağı tablosu arama seçeneğini neredeyse tamamen ortadan kaldırır ...


1

Tuz, Gökkuşağı sofrasını yapar tek bir şifre karmasının kırılmasını çok daha zor saldırılarını çok daha zor hale getirir. Sadece 1 numaralı korkunç bir şifreniz olduğunu hayal edin. Bir gökkuşağı masa saldırısı bunu hemen çözer.

Şimdi, veritabanındaki her bir şifrenin birçok rastgele karakterden oluşan uzun bir rastgele değerle tuzlandığını hayal edin. Şimdi kötü "1" şifreniz db'de 1 karma değeri artı bir grup rastgele karakter (tuz) olarak saklanır, bu nedenle bu örnekte gökkuşağı tablosunun aşağıdaki gibi bir karma değerine sahip olması gerekir: 1.

Dolayısıyla, tuzunuzun güvenli ve rastgele bir şey olduğunu varsayarsak, örneğin ()% ISLDGHASKLU ( % #% #, hacker'ın gökkuşağı tablosunun 1 * ()% ISLDGHASKLU (*% #% # için bir girişe sahip olması gerekir. Şimdi bir gökkuşağı tablosu kullanıyoruz) Bu basit şifre üzerinde bile artık pratik değil.


Lütfen 2 numaralı güncellemeye bakın, sadece ham şifreleriniz olur ve her kullanıcı kaydı için tuzlara karşı tüm karmaları hesaplarsınız.
Tom Gullen

2
Tabii Tom, katılıyorum, ama önemli olan, hacker'ın tuz kullanılıyorsa her şifre için bu çirkin zaman alıcı işlemi bir kez yapması gerektiğidir . Bu nedenle tuz, gökkuşağı masasını kullanmayı zorlaştırır.
Cory Evi

3
@Tom Gullen: tuzlu gökkuşağı tabloları oluşturmak, yalnızca site çapında tuzlar kullanıldığında mümkündür; kullanıcı başına tuzlama, gökkuşağı masa saldırılarını oldukça gereksiz kılar.
snemarch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.