मैंने ईमानदारी से यहां या कहीं और उत्तर खोजने की पूरी कोशिश की। बीक्रिप्ट दस्तावेज बताता है कि पासवर्ड हैश/नमक करने के लिए 2 तकनीकें हैं: तकनीक 1 (अलग-अलग फ़ंक्शन कॉल पर नमक और हैश उत्पन्न करें):
bcrypt.genSalt(saltRounds, function(err, salt) {
bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
// Store hash in your password DB.
});
});
और तकनीक 2 (ऑटो-जीन नमक और हैश):
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
// Store hash in your password DB.
});
ध्यान दें कि दोनों तकनीकें समान अंतिम परिणाम प्राप्त करती हैं...
यदि वे करते हैं, तो हमें कोड की अतिरिक्त पंक्तियों को जोड़ने की आवश्यकता क्यों है? क्या यह सिर्फ सौंदर्यवादी वरीयता है? या कोई व्यावहारिक कारण है?
शुक्रिया!
1 उत्तर
यह कई पुस्तकालयों में एक सामान्य कार्यान्वयन है जहां वे अधिक कठिन संस्करण का उपयोग करना चाहते हैं।
- वे जोर देते हैं कि आपको फ़ंक्शन चलाने के लिए आवश्यक हर चीज में पास होना होगा
- और वे नमक स्ट्रिंग में नमक और लागत और संस्करण को दूर करने के विवरण को सार करते हैं
मेरा मानना है कि विधि हस्ताक्षर होना चाहिए:
bcrypt.HashPassword("hunter2"); //using a default cost
bcrypt.HashPassword("hunter2", 15); //if we want to force a cost
लेकिन लगभग हर दूसरी bcrypt लाइब्रेरी कुछ ऐसा करती है:
String salt = bcrypt.GenerateSalt(); //using a default cost
bcrypt.HashPassword("hunter2", salt);
String salt = bcrypt.GenerateSalt(15); //if we want to for a cost
bcrypt.HashPassword("hunter2", salt);
क्योंकि तब आंतरिक रूप से क्या होता है जब वे सत्यापित एक हैश पर जाते हैं, वे संग्रहीत हैश से सहेजे गए नमक स्ट्रिंग को निकालते हैं:
String salt = GetSaltStringFromSavedHash(savedHash);
bcrypt.HashPassword("hunter2", salt);
और इसलिए वे दोनों कॉलों के लिए एक ही तरह से HashPassword
का उपयोग करने की इस समरूपता को केवल प्यार करते हैं।
मैं इस बात से असहमत हूं कि इनमें से कोई भी नमक उपयोगकर्ता के सामने प्रकट होना चाहिए - भले ही यह एक अपारदर्शी बूँद (यानी $2b$15$aXN0aWxsbG92ZXlvdWtn...
) के लिए डिज़ाइन किया गया हो।
मुझे लगता है कि यह होना चाहिए:
HashPassword(password);
HashPassword(password, costFactor);
लेकिन वह सिर्फ मैं हूँ; और मैं अकेला हूँ।