Bir şifreyi birden çok kez kullanmak daha güvenli midir?


43

Şifreleri saklarken, dizeleri 'iki kat hash yapmak' için iyi bir uygulama olduğunu birkaç kez okudum (mesela md5 ile sha1, her ikisi de tuzlu).

Sanırım ilk soru "bu gerçekten doğru mu?" Eğer değilse, o zaman lütfen, bu sorunun kalanını reddedin :)

Sormamın nedeni, bunun yüzünde bunun mantıklı olduğunu söyleyebilirim. Bununla birlikte, düşündüğümde, bir karmaşa her yeniden yapıldığında (muhtemelen buna eklenmiş bir şeyle), tüm görebildiğim, bağlılık ile ilgili olan nihai 'benzersizlik' üst sınırında bir azalma olduğu. ilk giriş.

Başka bir yolla söyleyeyim: karma olduğunda y olası dizelere indirgenen x dizgimiz var. Yani, ilk sette çarpışmalar var. Şimdi ikinci setten üçüncü sete gelmek, aynı şeyin gerçekleşmesi mümkün değil (yani, üçüncü sette aynı hash ile sonuçlanan tüm olası 'y' dizileri kümesindeki çarpışmalar)?

Kafamda gördüğüm tek şey, her karma işlev çağrısı için 'bir huni', sonsuz bir olasılık kümesini sonlu bir küme şeklinde hizalamak 've bunun gibi, ama açıkçası her çağrı, sonlu küme üzerinde çalışıyor, bize girişden daha büyük ayarlanmamış.

Belki bir örnek benim başıboş balıklarımı açıklar? 'A' ve 'b' karmasını '1' verecek ve 'c' ve 'd' karmasını '2' verecek olan 'hash_function_a' alın. Parolaları saklamak için bu işlevi kullanarak, parola 'a' olsa bile, 'b' parolasını kullanabilirim.

'1' ve '2' değerine '3' verecek olan 'hash_function_b' alın. Ben kullanmayı olsaydı bunu 'hash_function_a' sonra 'ikincil karma' olarak daha sonra şifre olsa bile 'a' Ben 'b', 'c' ya da 'd' kullanabilirsiniz.

Her şeyden öte, tuzların kullanılması gerektiğini anlıyorum, ancak bunlar 'x' girişlerini her seferinde 'x' çıkışlarından daha azına eşleştirdiğimiz gerçeğini gerçekten değiştirmiyorlar. Sanmıyorum

Birisi lütfen bana burada ne kaçırdığımı açıklayabilir mi?

Teşekkürler!

EDIT: buna değer, ben kendim yapmam, bcrypt kullanıyorum. Ve ben bir 'hacker' için 'döngü kullanmak' için yararlı olup olmadığı konusunda gerçekten endişelenmiyorum. Gerçekten sadece sürecin bir 'karmaşayı durma noktasından' güvenliği 'azaltıp azaltmadığını merak ediyorum.


2
@ S.Lott: Asıl soruya nasıl cevap verdiğini gerçekten göremiyorum, ancak tüm söylediği "ya kendin yapma, bu şeyi kullan" ya da "zaman ayırmak iyi!" .. hiçbiri “aslında daha güvenli değil” cevabını verdi. Yine, bir şey kaçırmıyorsam.
Nergis


Bu, BT Güvenliği için konuyla ilgili değildir, ancak Kriptografi ile iyi bir eşleşme gibi görünmektedir. Aslında, oradaki bu soruya oldukça benziyor .

Tuzsuz kullanmak isteyen bir şirket biliyorum MD5(password). Güvenli olmadığını söyledik, MD5(MD5(password))bunun yerine kullanmayı önerdiler ...
konfigüratör

Kabul edilen cevap doğru cevap değil!
markus

Yanıtlar:


27

Bu security.stackexchange'e daha uygundur ama ...

İle ilgili sorun

hash1(hash2(hash3(...hashn(pass+salt)+salt)+salt)...)+salt)

Bunun sadece zincirdeki en zayıf karma fonksiyonu kadar güçlü olmasıdır. Örneğin, eğer (en içteki karma) bir çarpışma verirse, bütün karma zinciri ( zincirdeki diğer karma değerlerden bağımsız olarak) bir çarpışma verecektir .

Daha güçlü bir zincir

hash1(hash2(hash3(...hashn(pass + salt) + pass + salt) + pass + salt)...) + pass + salt)

Burada erken çarpışma probleminden kaçınıyoruz ve esas olarak nihai hash için şifreye bağlı bir tuz üretiyoruz.

Ve eğer zincirdeki bir adım çarpışırsa farketmez çünkü bir sonraki adımda şifre tekrar kullanılır ve farklı şifreler için farklı bir sonuç vermelidir.


Bu yüzden şu anda bir sonraki karışmada tuz olarak "parola + tuz" eklemenin, huniye girebilecek "eşya" miktarını artırabileceğini görüyorum, şimdi sadece "ne kadar" olduğunu anlamak zorundayım. Teşekkürler.
Nergis

Aslında şimdi anladığımı düşünüyorum: şifrenizi her karma katmana zorlayarak, aslında 'çarpışan şifreyi' ve her bir 'çağrı' boyunca eşleşen hashta sahip olan gerçek şifreyi talep ederek olası çarpışma sayısını azaltıyor mu? , sağ? 'Her katmanda şifreyi gir' bölümünde eksik olduğumu düşünüyorum! Tekrar teşekkürler.
Nergis

Ayrıca (sürece, dış / nihai karma güçlü gibi) iç karma sadece bir sonraki geçiş için tuz oluşturma gibi zayıf iç karma izin veren avantaj vardır bir prob @Narcissus ve
mandal ucube

hum, sorunun biraz daha büyük (ve daha derin) olduğunu düşünüyorum. Gökkuşağı saldırılarıyla tüm karmaşınızı göz önünde bulundurarak sadece tablolar oluşturabilirsiniz ve sorun devam ediyor.
woliveirajr

4
@Narcissus: çok kısa bir cevapta: Evet, daha güvenli değil . Evet, muhtemelen daha az güvenlidir.
woliveirajr

54

Farklı karma algoritmalar kullanmak kötü bir fikirdir - arttırmak yerine entropiyi azaltır.

Bununla birlikte, kriptografik olarak güçlü bir karma algoritmasına ve iyi bir tuza sahip olduğunuzu varsayarsak , aynı karma işlevini birkaç kez uygulamak , karma işlemini daha hesaplamalı olarak pahalı kılar. Bunun yararı, şifre kırmanın diğer yolları başarısız olduğunda (tahmin, sözlük saldırıları, gökkuşağı tabloları, vb.) Ve saldırganın kaba kuvvet tekniklerine zorlanması, her şifreyi denemelerinin daha uzun sürmesidir. Aynı karma işlevi daha sık uygulamak zorundalar. Bu nedenle, bir tur karma karma bir aylık kaba zorlama gerektiriyorsa, on iki kez uygulamak, tahmini süreyi bir yıla çıkaracaktır.

Bcrypt gibi yeni karma algoritmalar bu fikir üzerine kuruludur; karma değerinin hesap karmaşıklığını kontrol etmek için bir parametre içerirler, böylece donanımın ilerlemesi hızlanırken ölçeklendirebilirsiniz: donanım iki kat daha hızlı hale geldiğinde, telafi etmek için karmaşıklığı arttırırsınız, böylece kabadayı zorlamanız için gereken zaman karma değerler kabaca sabit kalır.


2
Bu doğru cevap!
markus

@ markus: okuduğum tartışmaya göre, bu sadece kabul edilen cevabın hitap ettiği "ve iyi bir tuz" ilavesi nedeniyle doğru, değil mi? Bu neden doğru ve kabul edilen cevap değil?
Nergis

Bu doğru cevaptır, çünkü aynı karma fonksiyonunu birçok defa uygulamanın tek nedeni (parametreleştirilmiş) daha hızlı donanım ayarlamak için bu yinelemeyi kullanabilmenizdir. Aksi takdirde, birden fazla kez karmaşa yapmanın bir faydası yoktur.
markus

@Narcissus Buradaki anahtar entropidir. Aynı yöntemi kullanarak birçok kez karma alma arasında farklı yöntemler kullanarak birçok kez karma alma arasında bir fark vardır.
sakisk

3

Kriptografi ve / veya güvenlik mühendisliği dersleri almaya istekli olmadığınız sürece, kendi şifreleme şifreleme planınızı yazmaya çalışmayın.

PBKDF2, bcrypt, scrypt veya daha yeni Argon2 gibi anahtar türetme işlevini ( KDF ) kullanması gereken iyi kurulmuş bir şifre karma uygulaması kullanmalısınız .

İyi KDF'ler, çevrimdışı saldırıların maliyetini artırmak için genellikle bir dizi yinelemeye sahip bir iş faktörü içerir. Biri bu KDF'lerin şifreyi her seferinde aynı algoritmayı kullanarak defalarca kullandığını söyleyebilirdi. Diğerlerinin de belirttiği gibi, birden fazla ileti özeti algoritması kullanmanın bir anlamı yoktur.


1
bağlantı https://crackstation.net/hashing-security.htm firewall tarafından engellendi
gnat

1
@gnat Nedense, engellenen URL ile ilgili yorumunuzu kaçırdım. Bunu wikipedia'ya bir link ile değiştirdim.
Erwan Legrand

2

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 passwordssoruna 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.


2
Hata! Maalesef yorumum (kasıtlı olarak zaman aşımı parametresiyle hash yapmak) hakkında ciddiye alınmamıştı ... Son zamanlarda çok fazla Dilbert okudum sanırım.
SinirliFormsDesigner ile

2
sha (sha (sha (...))) sha'dan daha güvenli değildir. Sha fonksiyonunun entropisi maksimum değilse, bu aslında daha az güvenlidir.
deadalnix

1
@deadalnix: Orijinal şifreyi kurtarmayı kolaylaştırmadığını, ancak gereken tek şey olan çarpışan bir şifre oluşturmayı kolaylaştırdığını belirtmek önemlidir.
Bryan Boettcher

1
@deadalnix, bu yorumu Dale Gribble'ın sesiyle okudum .
jiggy

1
@deadalnix: sha (sha (sha ())) 'ın amacı daha fazla entropi eklemek değildir ve asla olmamıştır. Entropi sadece şifresini seçen ilk kullanıcı tarafından yapılır, diğer her şey (karma, tuz vb.) Kaba kuvvet saldırısını yavaşlatmak içindir. Birisi şifrelerinizi içeren veritabanınızı elde edebiliyorsa, muhtemelen şifreyi de şifrelemek için kullanılan kodu alır, bu nedenle herhangi bir sabit kodlu tuz da bilinir
woliveirajr

-1

Benim anladığım kadarıyla, birden fazla karma algoritması kullanmanın gökkuşağı tablolarını yenmektir . İyi bir tuz kullanmak da işe yarar, ancak sanırım ikinci bir koruma seviyesi.


4
Peki, bu o kadar değişmez. «Çoklu karma» fonksiyonu, tek olarak görülebilir ve bu şekilde muamele edilebilir.
deadalnix

2
Birden fazla karma tekniği veya yinelemeyi kullanmak, gökkuşağı tablolarını yenmek için hiçbir şey yapmaz. Bir saldırgan veritabanınıza sahipse ve hashları üretmek için kullanılan yönteme sahipse, saldırgan daha sonra veritabanındaki tüm parolalara saldırmak için bir gökkuşağı tablosu oluşturabilir. SALTS, saldırganın 8 karakterli veya daha az olan tüm şifrelere saldırması için tek bir arama sözlüğü oluşturmasını engellediği için gökkuşağı masası saldırılarını önler.
Erik

-1

Bu daha güvenli değil. Ancak, aynı işleve sahip birden çok kez karma esasına dayanan bir tanıma protokolünüz vardır.

Bu böyle gider. Depolanan değer, A bilgisayarındaki hash ^ n (pass) değerindedir. B'nin n tamsayısını doğrulamasını ve B vermesini isteyin. B hesaplama karması ^ (n-1) (pass) yapar ve A'ya geri gönderir.

Karma (karma ^ (n-1) (geçiş)) == karma ^ n (geçiş) kontrolünü. Doğruysa, doğrulama yapılır. Fakat sonra, bir mağaza karması ^ (n-1) (pass) ve bir sonraki doğrulama, n yerine B n-1'i verir.

Bu, parolanın hiçbir zaman net olarak değiştirilmediğinden, A'nın parolanın ne olduğunu asla bilmediğinden ve kimlik doğrulamanın tekrarlama tarafından korunduğundan emin olun. Ancak, bu sınırlı bir ömür boyu şifre gerektirme dezavantajına sahiptir. N, 2 değerine ulaştığında, doğrulama işleminden sonra yeni bir şifre seçilmelidir.

Çoklu karma değerin bir başka kullanımı, bir isteğin onaylanmasını ve bütünlüğünü sağlamak için HMAC aracıdır. HMAC hakkında daha fazla bilgi için bkz. Http://en.wikipedia.org/wiki/HMAC .

Gerçek dünyada çoklu karma kullanımın çoğu fazladır. Senin durumunda, öyle görünüyor. Birden fazla karma işlevi kullanırsanız, hepsinin aynı entropiye sahip olmayacağını unutmayın, bu nedenle karma değerin gücünü azaltır. Örnek olarak, md5, shal'den daha az entropiye sahiptir, bu nedenle bir md5 üzerinde sha1 kullanılması, karma değerinin gücünü arttırmaz. Güç, genel olarak zayıf karma fonksiyonunun gücüne eşit olacaktır.

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.