इष्टतम bcrypt काम का कारक


81

पासवर्ड हैशिंग के लिए एक आदर्श bcrypt कार्य कारक क्या होगा।

अगर मैं 10 के कारक का उपयोग करता हूं, तो मेरे लैपटॉप पर पासवर्ड हैश करने के लिए लगभग .1s लगते हैं। यदि हम एक बहुत व्यस्त साइट के साथ समाप्त होते हैं, तो यह लोगों के पासवर्ड की जांच करने के लिए एक अच्छा सौदा बन जाता है।

शायद 7 के काम के कारक का उपयोग करना बेहतर होगा, कुल पासवर्ड हैश काम को लगभग .01s प्रति लैपटॉप-लॉगिन को कम करना है?

आप ब्रूट फोर्स सेफ्टी और ऑपरेशनल कॉस्ट के बीच ट्रेडऑफ कैसे तय करते हैं?


7
लागत ऑफ़लाइन हमलों को विफल करती है। जब "ऑनलाइन" आप सेवा हमले से इनकार करने के लिए प्रयासों (जैसे 5 सेकंड) के बीच न्यूनतम देरी का उपयोग कर सकते हैं।
इयान बॉयड

3
सूचना सुरक्षा पर डुप्लिकेट: अनुशंसित # bcrypt के लिए दौर की
ईसाई Strempfer

1
: किसी को दिलचस्पी के लिए, मैं सिर्फ सर्वर पर परीक्षण bcrypt प्रदर्शन (जो सुरक्षा, सर्वर लोड और प्रतिक्रिया-बार संतुलन के लिए स्पष्ट रूप से महत्वपूर्ण है) करने के लिए एक छोटा सा जावा CLI उपकरण लिखा github.com/cdraeger/hash-performance
Blacklight

जवाबों:


103

याद रखें कि मान पासवर्ड में संग्रहीत है $2a$(2 chars work)$(22 chars salt)(31 chars hash):। यह एक निश्चित मूल्य नहीं है।

यदि आपको लगता है कि लोड बहुत अधिक है, तो बस इसे अगली बार जब वे लॉग इन करें, तो आप गणना करने के लिए तेजी से कुछ करने के लिए क्रिप्ट करें। इसी तरह, जैसे-जैसे समय बीतता है और आपको बेहतर सर्वर मिलते हैं, अगर लोड कोई समस्या नहीं है, तो आप लॉग इन करने पर उनके हैश की ताकत को अपग्रेड कर सकते हैं।

चाल यह है कि इसे मूर के कानून के साथ भविष्य में हमेशा के लिए समान मात्रा में लेते रहें। संख्या log2 है, इसलिए हर बार जब कंप्यूटर गति में दोगुना हो जाता है, तो डिफ़ॉल्ट संख्या में 1 जोड़ें।

तय करें कि आप उपयोगकर्ता के पासवर्ड को बाध्य करने के लिए इसे कितने समय तक लेना चाहते हैं। उदाहरण के लिए कुछ सामान्य शब्द के लिए, आपके खाते के निर्माण ने शायद पहले से ही उन्हें चेतावनी दी थी कि उनका पासवर्ड कमजोर था। यदि यह 1000 आम शब्दों में से एक है, तो कहें, और यह प्रत्येक को परखने के लिए एक हमलावर 0.1s लेता है, जो उन्हें 100s खरीदता है (ठीक है, कुछ शब्द अधिक सामान्य हैं ...)। यदि किसी उपयोगकर्ता ने 'सामान्य शब्दकोश शब्द' + 2 नंबर चुना है, तो यह दो घंटे से अधिक है। यदि आपके पासवर्ड डेटाबेस से छेड़छाड़ की जाती है, और हमलावर केवल एक दिन में कुछ सौ पासवर्ड प्राप्त कर सकता है, तो आपने अपने पासवर्ड को सुरक्षित रूप से बदलने के लिए अपने अधिकांश उपयोगकर्ताओं को घंटों या दिनों में खरीदा है। यह उनके लिए समय खरीदने की बात है।

http://www.postgresql.org/docs/8.3/static/pgcrypto.html के पास आपके विचार करने के लिए पासवर्ड क्रैक करने के लिए कुछ समय है। बेशक, उनके द्वारा सूचीबद्ध पासवर्ड यादृच्छिक अक्षर हैं। शब्दकोश शब्द ... व्यावहारिक रूप से आप उस व्यक्ति को नहीं बचा सकते हैं जिसका पासवर्ड 12345 है।


8
यह वास्तव में एक उत्कृष्ट उत्तर है। मैंने लॉगिन आइडिया पर री-क्रिप्ट भी नहीं सोचा था। आपको बहुत - बहुत धन्यवाद!
क्रिस

1
रीक्रिएट कैसे होगा काम? आपको पुरानी bcrypt कार्य लागत को कहीं स्टोर करना होगा ताकि आप उन्हें लॉग इन करने के लिए उपयोग कर सकें और फिर उनके पासवर्ड को मान्य करने के बाद आप डेटाबेस में hash और cost अपडेट करेंगे?
जेरी सरविया

6
@JerrySaravia bcrypt की सुंदरता है कि लागत हैश के भीतर ही संग्रहीत किया जाता है है - तो आप की दुकान की जरूरत नहीं है कुछ भी अतिरिक्त। बस वर्तमान हैश के साथ प्रमाणित करें, फिर तुरंत एक अलग लागत के साथ हैश उत्पन्न करें। सरल!
मार्क लॉकर

@ मार्कलर, धन्यवाद मार्क! यह एक बी [सुंदर] क्रिप्ट है! लेकिन गंभीरता से, यह चीजों को बहुत आसान बनाता है और एक अद्भुत चीज है।
जेरी साराविया

ठीक है क्योंकि मुझे इसे संपादित करने की अनुमति नहीं है क्योंकि यह "उत्तर देने का गलत प्रयास" है (क्या आप लोग मेरे संपादनों को भी पढ़ते हैं?), मुझे इसके बजाय सूचना पर टिप्पणी करने की अनुमति दें। उदाहरण मान: $2y$08$fJS4yx0i8kiOzIBIamZ51OWTMrzyE/4je34Oxhw.5xxp3Es7Ke32W। कारण मैंने संपादित करने का प्रयास किया: यह मेरे लिए स्पष्ट नहीं था कि "2 वर्ण काम" एक अंक या हेक्स या कुछ और था, परीक्षण करना था। यहां बाकी सभी के लिए परीक्षा परिणाम है, इसलिए आपको इसे स्वयं नहीं आज़माना होगा।
ल्यूक

3

लघु संस्करण

पुनरावृत्तियों की संख्या जो गणना करने के लिए कम से कम 250 एमएस देती है

दीर्घ संस्करण

जब BCrypt पहली बार प्रकाशित हुआ था, 1999 में, उन्होंने अपने कार्यान्वयन की डिफ़ॉल्ट लागत कारकों को सूचीबद्ध किया:

  • सामान्य उपयोगकर्ता: 6
  • सुपर उपयोगकर्ता: 8

6 की एक bcrypt लागत का मतलब 64 राउंड (2 6 = 64) है।

उन्होंने यह भी ध्यान दिया:

बेशक, जो भी लोग चुनते हैं, उन्हें समय-समय पर फिर से मूल्यांकन किया जाना चाहिए

  • 1976 में तैनाती के समय, क्रिप्ट प्रति सेकंड 4 से कम पासवर्ड हैश कर सकता था। (250 एमएस प्रति पासवर्ड)
  • 1977 में, VAX-11/780 पर, क्रिप्ट (MD5) का मूल्यांकन प्रति सेकंड 3.6 गुना किया जा सकता था। (277 एमएस प्रति पासवर्ड)

यह आपको उस तरह की देरी का स्वाद देता है जो मूल कार्यान्वयनकर्ताओं ने विचार किया था जब उन्होंने इसे लिखा था:

  • ~ 250 एमएस सामान्य उपयोगकर्ताओं के लिए
  • सुपर उपयोगकर्ताओं के लिए ~ 1 सेकंड।

लेकिन, निश्चित रूप से, आप जितने लंबे समय तक खड़े रह सकते हैं, बेहतर है। प्रत्येक BCrypt कार्यान्वयन मैंने 10डिफ़ॉल्ट लागत के रूप में उपयोग किया है । और मेरे कार्यान्वयन ने इसका इस्तेमाल किया। मेरा मानना ​​है कि मेरे लिए डिफ़ॉल्ट लागत को बढ़ाकर 12 करने का समय है।

हमने तय किया है कि हम प्रति हैश 250 ग्राम से कम का लक्ष्य नहीं रखना चाहते हैं।

मेरा डेस्कटॉप पीसी एक Intel Core i7-2700K CPU @ 3.50 GHz है। मैंने मूल रूप से 1/23/2014 को बीसीक्रिप्ट कार्यान्वयन लागू किया:

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 |

यहाँ छवि विवरण दर्ज करें

फ्यूचर प्रूफिंग

निश्चित स्थिर होने के बजाय, यह एक निश्चित न्यूनतम होना चाहिए ।

आपका पासवर्ड हैश फ़ंक्शन होने के बजाय:

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

यह कुछ इस तरह होना चाहिए:

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;
}

और आदर्श रूप से यह सभी के बीसीक्रिप्ट लाइब्रेरी का हिस्सा होगा, इसलिए समय-समय पर लागत में वृद्धि करने के लिए पुस्तकालय के उपयोगकर्ताओं पर निर्भर होने के बजाय, लागत समय-समय पर स्वयं बढ़ जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.