it-swarm-tr.com

Bcrypt için önerilen tur sayısı

Günümüzde (Temmuz 2012) ortalama bir web sitesi için bir şifre oluşturmak için önerilen bcrypt tur sayısı nedir (sadece isim, e-posta adresi ve ev adresini saklar, ancak kredi kartı veya tıbbi bilgi depolamaz)?

Başka bir deyişle, bcrypt şifre kırma topluluğunun şu anki kapasitesi nedir? Birkaç bcrypt kütüphanesi varsayılan ayar olarak 12 mermi (2 ^ 12 yineleme) kullanır. Bu önerilen çalışma faktörü mü? 6 mermi yeterince güçlü olmazsa (Javascript'te istemci tarafı bcrypt karma işlemi için sınır olur), ayrıca bkz. Zorlu zorluk: istemci tarafı şifre karma ve sunucu tarafı şifre doğrulaması )?

Çeşitli faktörleri nasıl dengeleyeceğimize dair derinlemesine bir tartışma sağlayan cevabı https://security.stackexchange.com/a/3993/11197 okudum. (PBKDF2-SHA256 için de olsa). Ancak, gerçek bir sayı arıyorum. Temel kural.

94
Jason Smith

Sanırım tüm sorularınızın cevabı zaten Thomas Pornin'in cevabı . Bununla bağlantı kurdunuz, bu yüzden muhtemelen biliyorsunuzdur, ancak tekrar okumanızı öneririm.

Temel ilkeler şunlardır: birkaç tur seçmeyin; bunun yerine, parola doğrulamasının sunucunuzda geçeceği süreyi seçin, ardından buna göre mermi sayısını hesaplayın. Doğrulamanın dayanabildiğiniz sürece sürmesini istiyorsunuz.

Somut sayıların bazı örnekleri için, Thomas Pornin'in cevabına bakınız. Parola doğrulamasının/karma işleminin parola başına 241 milisaniye alması için makul bir hedef olduğunu öne sürüyor. (Not: Thomas başlangıçta "8 milisaniye" yazdı, bu yanlış - bu bir ay yerine bir günlük sabır rakamıdır.) Bu, sunucunuzun saniyede 4 şifreyi doğrulamasını sağlar (paralel olarak yapabiliyorsanız daha fazlası). Thomas, hedefiniz buysa, yaklaşık 20.000 turun doğru basketbol sahasında olduğunu tahmin ediyor.

Ancak, en uygun tur sayısı işlemcinizle değişecektir. İdeal olarak, işlemcinizin ne kadar sürdüğünü kıyaslar ve numarayı buna göre seçersiniz. Bu o kadar uzun sürmez; bu yüzden en iyi sonuçlar için, komut dosyasını hazırlayın ve parola karma işleminin sunucunuzda yaklaşık 240 milisaniye sürdüğünden emin olmak için kaç tur gerektiğini düşünün (veya taşıyabiliyorsanız daha uzun).

41
D.W.

BCrypt ilk yayınlandığında, 1999 yılında, uygulamalarının varsayılan maliyet faktörlerini listelediler:

  • normal kullanıcı: 6
  • süper kullanıcı: 8

Ayrıca şunu da not ederler:

Tabii ki, insanların seçtiği maliyet ne olursa olsun zaman zaman yeniden değerlendirilmelidir.

Bcrypt maliyeti 6 64 mermi (2 6  = 64).

Bu başlangıç ​​ "normal kullanıcı" değerini kullanırsak, güç enflasyonunun hesaplanması için ayarlamayı denemek isteriz ( ortalama olarak her 18 ayda bir iki katına çıkarak ).

R = R × 2(Ay/18)
R = 64 × 2(Ay/18)

Bugün (9 Mart 2015) 12/31/1999 tarihinden bu yana 171 aydır (veya basitlik için 1/1/2000 kullanın), mermi sayısı 9 katın biraz üzerinde iki katına çıkmış olmalıdır:

R = 64 × 2(171/18)
R = 64 × 29.5
R = 64 × 724.1
R = 46.341,0

Sonunda, bunu tekrar bir maliyet faktörü

maliyet = ln (R)/ln (2)
maliyet = ln (46.341,0)/ln (2)
maliyet = 15,5

15 maliyet faktörünün pratikliği, sunucunuzun bilgi işlem gücüne bağlıdır. Örneğin, masaüstü bilgisayarım 3.50 GHz'de Intel Core i7-2700K CPU. Başlangıçta bir BCrypt uygulamasını 1/23/2014 tarihinde karşılaştırdım:

1/23/2014  Intel Core i7-2700K CPU @ 3.50 GHz

| Cost | Iterations        |    Duration |
|------|-------------------|-------------|
|  8   |    256 iterations |     38.2 ms | <-- minimum allowed by BCrypt
|  9   |    512 iterations |     74.8 ms |
| 10   |  1,024 iterations |    152.4 ms | <-- current default (BCRYPT_COST=10)
| 11   |  2,048 iterations |    296.6 ms |
| 12   |  4,096 iterations |    594.3 ms |
| 13   |  8,192 iterations |  1,169.5 ms |
| 14   | 16,384 iterations |  2,338.8 ms |
| 15   | 32,768 iterations |  4,656.0 ms |
| 16   | 65,536 iterations |  9,302.2 ms |

Ama bu 2014'tü

Bu zamanlamalar başlangıçta 2014'ün başında hesaplanmıştır. Hesaplamamda yalnızca 156 ay (171 yerine) ay kullanılmalıydı:

R = 64 × 2(156/18)
R = 64 × 28.66
R = 64 × 406,8
R = 26.035,2

maliyet = ln (R)/ln (2)
maliyet = ln (26.035.2)/ln (2)
maliyet = 14,7

Ancak i7-2700K zaten durduruldu

I7-2700K, kıyaslamalarımı çalıştırdığımda zaten durduruldu (2013 1. Çeyrek). 2011'in 4. çeyreğinde piyasaya sürüldü ve son teknoloji ürünü oldu. 2011'in 4. çeyreğine ait sayıları çalıştırırsam:

R = 64 × 2(129/18)
R = 64 × 27.16
R = 64 × 143,7
R = 9.186,8

maliyet = ln (R)/ln (2)
maliyet = ln (9,196,8)/ln (2)
maliyet = 13,2

13 maliyeti, masaüstümde, yaklaşık 2 saniye bir saniyeden fazla.

Ne kadar dayanabilirsin?

Bu, orijinal uygulayıcıların yazarken dikkate aldıkları gecikmelerin bir çeşidini verir: ~ 0.5-1 saniye.

Ancak, elbette, ne kadar uzun süre dayanırsanız, o kadar iyi. Gördüğüm her BCrypt uygulaması 10 varsayılan maliyet olarak. Ve benim uygulamam bunu kullandı. Varsayılan maliyeti 12'ye çıkarmamın zamanının geldiğine inanıyorum.

Gelecekteki Prova

Ayrıca karma işlevini de değiştirebilirim:

hash = HashPassword("correct battery horse stapler");

yani, otomatik olarak kayan bir maliyeti kullanmak için varsayılan maliyete güvendiğiniz maliyet. Bu şekilde maliyet zamanla kendiliğinden artar. Değiştirme:

String HashPassword(String password)
{
   return BCrypt.HashPassword(password, BCRYPT_DEFAULT_COST);
}

gibi bir şeye:

String HashPassword(String password)
{  
   /*
     Rather than using a fixed default cost, run a micro-benchmark
     to figure out how fast the CPU is.
     Use that to make sure that it takes **at least** 250ms to calculate
     the hash
   */
   Int32 costFactor = this.CalculateIdealCost();
   //Never use a cost lower than the default hard-coded cost
   if (costFactor < BCRYPT_DEFAULT_COST) 
      costFactor = BCRYPT_DEFAULT_COST;

   return BCrypt.HashPassword(password, costFactor);
}

Int32 CalculateIdealCost()
{
    //Benchmark using a cost of 5 (the second-lowest allowed)
    Int32 cost = 5;

    var sw = new Stopwatch();
    sw.Start();
    this.HashPassword("microbenchmark", cost);
    sw.Stop();

    Double durationMS = sw.Elapsed.TotalMilliseconds;

    //Increasing cost by 1 would double the run time.
    //Keep increasing cost until the estimated duration is over 250 ms
    while (durationMS < 250)
    {
       cost += 1;
       durationMS *= 2;
    }

    return cost;
}

Düzenle 3/12/2015 : Güncellenmiş hız numaraları. Delphi XE6 32 bit derleyici (c.2013) aynı işlemci için Delphi 5'ten (c.1999) daha hızlı bir büyüklük sırası kodu üretir. Delphi XE6 64 bit derleyici 32 bit derleyiciden% 20 daha yavaş kod üretir.

61
Ian Boyd

Sıralı Hafıza-Sert Fonksiyonlar ile Daha Güçlü Anahtar Türetme , anahtar genişletme konusunda çok iyi bir makaledir. 14 Sayfasında çeşitli karma algoritmaları, hash'ı kırmanın ne kadar paraya mal olacağını karşılaştırır, bu da bu şeyler hakkında düşünmenin yararlı bir yoludur. (Yan notta, TPM yoksa ChromeOS Scrypt kullanır.)

Buradaki fikir, bu parola karmalarının mümkün olduğunca uzun süre kırılmasını istemenizdir. Moore yasası ile bu katlanarak hızlı hareket eden bir hedeftir. Scrypt değişken miktarda bellek ve cpu kullanır, bu değişken zamanın bir fonksiyonu olarak ağırlaşabilir. Böylece, istemci her oturum açışında daha güvenli olması için parola karmasını güncelleyebilirsiniz. PBKDF2 söz konusu olduğunda, bu rounds=2^(current_year-2000) veya buna benzer bir şeye benzeyebilir.

Bu işlemi istemciye yükleyemeyeceğinizi ve protokolünüzün güvenli olmasını bekleyemeyeceğinizi belirtmek önemlidir. Tanıdığım tüm istemci tarafı karma kimlik doğrulama protokolleri, kimlik doğrulama bilgilerini (NTLM, NTLMv2, SRP, WPA-PSK ...) doğrulamak için sunucunun aynı hesaplamayı yapmasını gerektirir.

3
rook