PBKDF2 (özellikle SHA-256 ile) kullanırken kaç tekrarlamanın 'yeterince iyi' olduğunu belirleme konusunda herhangi bir tavsiye veya referans noktası olup olmadığını merak ediyorum. Kuşkusuz, 'yeterince iyi' tanımlamak özneldir ve tanımlanması zordur, uygulama ve risk profiline göre değişir ve bugün 'yeterince iyi' olan şey yarın 'yeterince iyi' olmayabilir ...
Ancak soru hala devam ediyor, endüstri şu anda 'yeterince iyi' ne düşünüyor? Karşılaştırma için hangi referans noktaları mevcuttur?
Bulduğum bazı referanslar:
Kaç tane yinelemenin uygulamanız için 'yeterince iyi' olduğunu belirlediğinizle ilgili ek referansları veya geri bildirimleri takdir ediyorum.
Ek arka plan olarak, PBKDF2-SHA256 güvenlik bilincine sahip bir web sitesi için depolama için kullanıcı parolaları karma kullanılan yöntem olarak düşünüyorum. Planladığım PBKDF2 tuzu: küresel bir tuzla XOR'lu kullanıcı başına rastgele bir tuz (her kullanıcı kaydında açık olarak saklanır). Amaç, kaba zorlama şifrelerinin maliyetini artırmak ve aynı şifreleri olan kullanıcı çiftlerini ortaya çıkarmaktan kaçınmaktır.
Referanslar:
Uygulamanızda tolere edilebilir, performans açısından maksimum tur sayısını kullanmalısınız. Mermi sayısı, normal kullanım koşullarında, böyle bir yavaşlamanın sizin için ihmal edilebilir bir etkiye sahip olması temelinde kullandığınız bir yavaşlama faktörüdür (kullanıcı görmez, ekstra CPU maliyeti daha büyük bir sunucu satın almayı ima etmez ve yakında). Bu büyük ölçüde operasyonel içeriğe bağlıdır: hangi makinelerin dahil olduğu, saniyede kaç kullanıcı kimlik doğrulaması ... böylece tek bedene uyan bir yanıt yoktur.
Geniş resim şöyle gider:
Amacınız tek bir şifreyi kırmak için ortalama maliyeti saldırganın sabrını aşmaktır, böylece denememek ve başka, daha kolay bir hedefe konsantre olmaya devam etmek. Yukarıda detaylandırılan gösterimlerle, bu istediğiniz anlamına gelir:
v · 2n-1 > f · p
p kontrolünüz dışında; kullanıcı şifreleri ile korunan veri ve sistemlerin değer değeri ile ilgili tahmin edilebilir. Diyelim ki p bir ay (bir aydan fazla sürerse, saldırgan denemeyi rahatsız etmez). Daha büyük bir sunucu satın alarak f küçültebilirsiniz; Öte yandan, saldırgan daha büyük makineler satın alarak f büyütmeye çalışacaktır. Ağırlaştırıcı bir nokta, şifre kırmanın tanç verici bir şekilde paralel bir görev olması, bu nedenle saldırganın genel programlamayı destekleyen GP kullanarak büyük bir destek alacağıdır. bu yüzden tipik bir f hala birkaç yüzlerce sırada değişir.
n, katı bir şifre seçim politikası yoluyla bir şekilde etkileyebileceğiniz şifrelerin kalitesi ile ilgilidir, ancak gerçekçi bir şekilde n ötesi bir değer elde etmekte zorlanacaksınız. , diyelim ki 32 bit. Daha güçlü parolalar uygulamaya çalışırsanız, kullanıcılar parolaları başka bir yerden yeniden kullanma, yapışkan notlara parola yazma vb. Gibi geçici çözümlerle aktif olarak sizinle savaşmaya başlarlar.
Yani kalan parametre v. f = 2 (bir düzine iyi GPU'ya sahip bir saldırgan), bir aylık sabır ve n = 32 ile v en az 241 milisaniye olmalıdır (not: Başlangıçta buraya "8 milisaniye" yazdım, bu yanlış - bu bir ay yerine bir günlük sabır için bir rakam). Bu yüzden PBKDF2'deki raund sayısını, tek bir parola üzerinden hesaplamanın sunucunuzda en az bu kadar zaman alacağı şekilde ayarlamanız gerekir. Yine de saniyede dört şifreyi tek bir çekirdeği ile doğrulayabileceksiniz, bu nedenle CPU etkisi muhtemelen ihmal edilebilir (*). Aslında, bundan daha fazla mermi kullanmak daha güvenlidir, çünkü ortalama kullanıcı şifresinden 32 bitlik entropi elde etmek biraz iyimser; Öte yandan, pek çok saldırı bir ay boyunca düzinelerce PC'yi tek bir şifreyi kırma görevine adamayacaktır, bu nedenle belki bir günlük "saldırganın sabrı" daha gerçekçi olur ve 8 milisaniyelik bir şifre doğrulama maliyetine yol açar.
Bu yüzden birkaç kıyaslama yapmanız gerekiyor. Ayrıca, yukarıdakiler PBKDF2/SHA-256 uygulamanız hızlı olduğu sürece çalışır. Örneğin, tamamen C #/Java tabanlı bir uygulama kullanıyorsanız, CPU-yoğun görevler için tipik 2 ila 3 yavaşlama faktörünü (C veya Assembly ile karşılaştırıldığında) alacaksınız; yukarıdaki gösterimlerde, bu f ile 2 veya 3'ü çarpmakla eşdeğerdir. Bir karşılaştırma temeli olarak, 2,4 GHz Core2 CPU saniyede yaklaşık 2,3 milyon temel SHA-256 hesaplama yapabilir (tek bir yani, bu CPU'da "8 milisaniye" hedefine ulaşmak için yaklaşık 20000 tur anlamına gelir.
(*) Parola doğrulamasını daha pahalı hale getirmenin sunucunuzu Hizmet Reddi saldırıları 'a karşı daha savunmasız hale getirmesine dikkat edin. Saniyede çok fazla istek gönderen istemci IP adreslerini geçici olarak kara listeye almak gibi bazı temel önlemleri uygulamalısınız. online sözlük saldırılarını engellemek için yine de yapmanız gerekir.
Çalıştırmak
openssl speed komut satırında mesaj özeti işlevlerinin ne kadar hızlı olduğu hakkında bir fikir edinmek için. Dört çekirdekli 2.2ghz Sandy Bridge'de günde yaklaşık 1.6 milyon sha256 hashes veya yaklaşık 145 Milyar tahmin hesaplayabilirim. Birinin İngilizce sözlükte bir parola varsa ve bir sha256 turu kullandıysa, Word listesini diskten çıkarmak, karma'yı kırmak için liste üzerinde yinelemekten daha uzun sürer. Birkaç yüz bin mermi ile PKBDF2-SHA256 yaptıysanız, kırılması birkaç dakika sürecektir. Güçlü bir şifre politikası uygulamak, çok yardımcı olur.
Gerçek cevap: Ne kadar zaman yakmak zorundasın?
Thomas'ın cevabı faydalı bir temel model ve veri sağlar. Fakat ortaya koyduğu hedef benim için bir anlam ifade etmiyor. Tipik bir saldırgan, siteyi gerçekten hackleyip karma veritabanını yakalayana kadar yineleme sayınızı bilmez. Bunu yaptıktan sonra, sadece büyük bir yineleme sayısı kullandığınız için ilerlemezler. Mümkün olduğu kadar çok çatlamaya çalışacaklar ve büyük olasılıkla hash'ları yayınlayacaklar, böylece diğerleri yıllarca daha güçlü bir donanım ile gelmek için onları çatlamaya devam edecekler. Yani "p" ve "f" her ikisi de hack'ten çok sonra artmaya devam edecek.
Ayrıca, gerçek kullanıcı şifreleri 32 bit entropi gibi bir karmaşıklık ölçüsü ile iyi bir şekilde modellenmemiştir. Yeniden Kullanılabilir Güvenlik: Şifre Güvenliği Metrikleri Hakkında Yeni Makale makalesi bu konuda yardımcıdır ve uzun zamandır bildiğimiz belgeleri belgelemektedir: birçok kullanıcı tahmin edilmesi kolay şifreler seçer ve uzun bir kuyruk vardır. Bu aynı zamanda saldırganların yeterince uğraşırlarsa her zaman bir şeyler bulacağı anlamına gelir.
Daha olası bir hedefin, kullanıcılarınızın mümkün olduğunca büyük bir yüzdesinin şifrelerini kırmaktan korumak olduğunu söyleyebilirim. Örneğin. PDF tablo 4.2.1, bir saldırı kampanyası sırasında saldırganınızı karma başına ortalama 1 milyon denemeden 500.000 denemeye sınırlamayı başardıysanız , kullanıcılarınızın% 5'inin şifrelerini koruyabilirsiniz (8'den fazla karakter şifresinden daha fazla 7 karakterlik şifreler içeren bir karışım varsayarak kırık yüzdeyi% 35'ten% 30'a düşürür). Tabii ki eğrinin tam şekli ve üzerinde oldukları yer büyük ölçüde değişecektir.
Bu yüzden, gerçek kullanıcıları normal girişleri geciktirmediği sürece, bütçeleyebileceğiniz maksimum yineleme sayımı için gidiyorum. Ve hesaplama kapasiteniz yıllar içinde büyüdükçe değeri artırmalısınız.
8 mevcut nesil GPU ile donatılan modern bir makine, saniyede 9 milyar SHA-256 karma veya günde yaklaşık 777 Trilyon karma sırasına göre hesaplayacak ve bu GPU'lar kural tabanlı sözlük saldırıları gerçekleştirebilir.
Bunu çok uzun bir yorum olarak kabul edin. Kişisel dizüstü bilgisayarımda işlerin ne kadar hızlı çalıştığını merak ediyordum (Thinkpad T460p, Intel i7-6700HQ ). Tuzlu şifreleri kırmak için özel cihazlar olduğunu biliyorum, ancak bir web servisiniz varsa bunun için özel bir donanımınız yoktur.
Varsayılan değer
werkzeug.security.generate_password_hash şu anda (2019-06-01)
pbkdf2:sha256:150000.
Gördüğünüz gibi, yürütme süresi mermi/yineleme sayısı ile doğrusal olarak büyür. Bu, varsayılan değer, makinemde yaklaşık 281 ms sürüyor demektir.
sha512, 1 iteration : min: 67.1μs, mean: 72.2μs, max: 310.9μs sha512, 15000 iteration: min: 38462.8μs, mean: 40291.2μs, max: 44842.4μs sha256, 15000 iteration: min: 27167.6μs, mean: 28118.0μs, max: 30826.0μs sha512, 1000 iteration: min: 2636.7μs, mean: 2694.3μs, max: 3579.0μs sha256, 1000 iteration: min: 1870.7μs, mean: 1888.8μs, max: 2477.0μs md5, 15000 iteration: min: 21126.2μs, mean: 21864.8μs, max: 23799.3μs sha512, 1 iteration : min: 23.4μs, mean: 26.9μs, max: 40.6μs sha512, 1000 iteration: min: 2586.7μs, mean: 2761.1μs, max: 3120.6μs sha256, 1000 iteration: min: 1823.3μs, mean: 1834.6μs, max: 2008.5μs sha512, 15000 iteration: min: 38507.9μs, mean: 40210.8μs, max: 47430.3μs sha256, 15000 iteration: min: 27257.1μs, mean: 28454.0μs, max: 31213.5μs md5, 15000 iteration: min: 21219.9μs, mean: 21842.4μs, max: 24305.0μs