c# क्या कोई बता सकता है कि कैसे बीक्रिप्ट एक हैश की पुष्टि करता है?




bcrypt bcrypt.net (2)

बीसीआरईपी हैश के साथ पासवर्ड की पुष्टि कैसे कर रहा है अगर यह नमक को कहीं भी नहीं बचा रहा है?

स्पष्ट रूप से यह ऐसी कोई काम नहीं कर रहा है। नमक कहीं बचाया जाना है।

आइए विकिपीडिया पर पासवर्ड एन्क्रिप्शन योजनाएं देखें। http://en.wikipedia.org/wiki/Crypt_(Unix) से:

फ़ंक्शन का आउटपुट केवल हैश नहीं है: यह एक टेक्स्ट स्ट्रिंग है जो नमक को एन्कोड करता है और हैश एल्गोरिदम का उपयोग करता है।

वैकल्पिक रूप से, इस विषय पर आपके पिछले प्रश्न का उत्तर स्रोत कोड का एक लिंक शामिल था। आपके लिए स्रोत कोड पढ़ने के लिए इंटरनेट से पूछने के बजाय, आप हमेशा इसे स्वयं पढ़ना चुन सकते हैं। यह शायद आपका जवाब तेजी से प्राप्त होगा। स्रोत कोड का प्रासंगिक खंड है:

    StringBuilder rs = new StringBuilder();
    rs.Append("$2");
    if (minor >= 'a') {
        rs.Append(minor);
    }
    rs.Append('$');
    if (rounds < 10) {
        rs.Append('0');
    }
    rs.Append(rounds);
    rs.Append('$');
    rs.Append(EncodeBase64(saltBytes, saltBytes.Length));
    rs.Append(EncodeBase64(hashed,(bf_crypt_ciphertext.Length * 4) - 1));
    return rs.ToString();

स्पष्ट रूप से लौटाई गई स्ट्रिंग संस्करण की जानकारी है, इसके बाद इस्तेमाल किए गए राउंड की संख्या के बाद, बेस 64 के रूप में एन्कोड किए गए नमक के बाद, हैश को बेस 64 के रूप में एन्कोड किया गया है।

मैं अपने पासवर्ड हैश करने के लिए सी # और BCrypt.Net का उपयोग कर रहा हूँ।

उदाहरण के लिए:

string salt = BCrypt.Net.BCrypt.GenerateSalt(6);
var hashedPassword = BCrypt.Net.BCrypt.HashPassword("password", salt);

//This evaluates to True. How? I'm not telling it the salt anywhere, nor
//is it a member of a BCrypt instance because there IS NO BCRYPT INSTANCE.
Console.WriteLine(BCrypt.Net.BCrypt.Verify("password", hashedPassword));
Console.WriteLine(hashedPassword);

बीसीआरईपी हैश के साथ पासवर्ड की पुष्टि कैसे कर रहा है अगर यह कहीं भी नमक को बचा नहीं रहा है। मेरे पास एकमात्र विचार यह है कि यह किसी भी तरह हैश के अंत में नमक को जोड़ रहा है।

क्या यह एक सही धारणा है?


एक बीक्रिप्ट हैश स्ट्रिंग इस तरह दिखता है:

$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm
$==$==$======================-------------------------------

कहा पे

  • 2a : एल्गोरिदम पहचानकर्ता (बीसीआरपीटी, यूटीएफ 8 एन्कोडेड पासवर्ड, शून्य समाप्त)
  • 10 : लागत फैक्टर (2 10 = 1,024 राउंड)
  • Ro0CUfOqk6cXEKf3dyaM7O : ओपनबीएसडी-बेस 64 एन्कोडेड नमक (22 वर्ण, 16 बाइट्स)
  • hSCvnwM9s4wIX9JeLapehKK5YdLxKcm : ओपनबीएसडी-बेस 64 एन्कोडेड हैश (31 वर्ण, 24 बाइट्स)

संपादित करें : मैंने अभी देखा है कि ये शब्द ठीक से फिट हैं। मुझे साझा करना था:

$2a$10$TwentytwocharactersaltThirtyonecharacterspasswordhash
$==$==$======================-------------------------------

बीसीआरपीटी 16-बाइट नमक का उपयोग करके 24-बाइट बाइनरी हैश बनाता है । बाइनरी हैश और नमक को स्टोर करने के लिए आप स्वतंत्र हैं, हालांकि आपको पसंद है; कुछ भी नहीं कहता है कि आपको बेस -64 को स्ट्रिंग में एन्कोड करना होगा।

लेकिन बीसीआरपीटी उन लोगों द्वारा बनाई गई थी जो ओपनबीएसडी पर काम कर रहे थे। ओपनबीएसडी पहले से ही अपनी पासवर्ड फ़ाइल के प्रारूप को परिभाषित करता है:

$ [HashAlgorithmIdentifier] [AlgorithmSpecificData] [HashAlgorithmIdentifier] $ [AlgorithmSpecificData] [HashAlgorithmIdentifier] [AlgorithmSpecificData]

इसका मतलब है कि "bcrypt विनिर्देश" निष्पक्ष रूप से ओपनबीएसडी पासवर्ड फ़ाइल प्रारूप से जुड़ा हुआ है। और जब भी कोई "bcrypt हैश" बनाता है तो वे हमेशा इसे प्रारूप की आईएसओ -885 9 -1 स्ट्रिंग में परिवर्तित करते हैं:

$ 2a $ [Cost] $ [Base64Salt][Base64Hash]

कुछ महत्वपूर्ण बिंदु:

  • 2a एल्गिथ्म पहचानकर्ता है
    • 1: एमडी 5
    • 2: शुरुआती बीक्रिप्ट, जिसमें भ्रम था कि कौन से एन्कोडिंग पासवर्ड हैं (अप्रचलित)
    • 2 ए: वर्तमान बीक्रिप्ट, जो पासवर्ड को यूटीएफ -8 एन्कोडेड के रूप में निर्दिष्ट करता है
  • हैश की गणना करते समय लागत एक लागत कारक है। "वर्तमान" मान 10 है, जिसका अर्थ है कि आंतरिक कुंजी सेटअप 1,024 राउंड के माध्यम से जाता है
    • 10: 2 10 = 1,024 पुनरावृत्तियों
    • 11: 2 11 = 2,048 पुनरावृत्तियों
    • 12: 2 12 = 4,0 9 6 पुनरावृत्तियों
  • OpenBSD पासवर्ड फ़ाइल द्वारा उपयोग किया गया बेस 64 एल्गोरिदम समान बेस 64 एन्कोडिंग नहीं है जो हर कोई उपयोग करता है; उनके पास अपना है:

    Regular Base64 Alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
        BSD Base64 Alphabet: ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
    

    इसलिए bcrypt का कोई भी कार्यान्वयन किसी अंतर्निहित, या मानक, बेस 64 लाइब्रेरी का उपयोग नहीं कर सकता है

इस ज्ञान के साथ सशस्त्र, अब आप सहेजे गए हैश के खिलाफ एक पासवर्ड correctbatteryhorsestapler सत्यापित कर सकते हैं:

$2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km




bcrypt.net