कैसे नमक के बिना has.bcrypt.js हैशेड और प्लेनटेक्स्ट पासवर्ड की तुलना करता है?


95

से GitHub :

पासवर्ड रखने के लिए:

var bcrypt = require('bcrypt');
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
        // Store hash in your password DB.
    });
});

पासवर्ड जाँचने के लिए:

// Load hash from your password DB.
bcrypt.compare("B4c0/\/", hash, function(err, res) {
    // res == true
});
bcrypt.compare("not_bacon", hash, function(err, res) {
    // res = false
});

ऊपर से, तुलना में कोई नमक मान शामिल नहीं हो सकता है? मुझे यहां क्या समझ नहीं आ रहा है?

जवाबों:


95

नमक को हैश (सादे के रूप में) में शामिल किया गया है। तुलना फ़ंक्शन केवल हैश से नमक खींचता है और फिर इसका उपयोग पासवर्ड को हैश करने और तुलना करने के लिए करता है।


1
मुझे अभी भी समझ नहीं आया। तुलना के दौरान, यह कैसे पता चलता है कि नमक के साथ प्रदान नहीं करने पर हैश का कौन सा हिस्सा नमक है?
सोमवार पेपर

6
bcrypt एक मानक है और हमेशा समान प्रारूप में हैश के साथ नमक को समेटता है। आप नमक देते हैं जब आप एन्क्रिप्ट करते हैं और यह हैश में शामिल हो जाता है। bcrypt केवल उन डेटा को डिक्रिप्ट करने में सक्षम होगा जो मूल रूप से bcrypt का उपयोग करके एन्क्रिप्ट किए गए थे, अन्यथा, आप सही हैं - यह जानने का कोई तरीका नहीं होगा कि कौन सा हिस्सा हैश और कौन सा हिस्सा नमक है।
बिल

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

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

3
इस तरह से देखें, क्या इससे कोई फर्क नहीं पड़ता कि हमलावर इस तरह डेटा बेस में कुछ उपयोगकर्ता के लिए नमक जानता है: column_password = hash, column_salt = saltबनाम column_password = hash_salt। हमलावर के पास अभी भी वही जानकारी है। नमक का बिंदु हर पासवर्ड को इतना यादृच्छिक और बड़ा बनाना है कि यह असंभावित हो जाता है कि किसी ने इसे पूर्वनिर्मित नहीं किया है।
मुहम्मद उमर

27

मेरे पास मूल पोस्टर के समान ही सवाल था और इसने तंत्र को समझने के लिए चारों ओर देखने और विभिन्न चीजों की कोशिश करने का एक नज़र लिया। जैसा कि पहले ही दूसरों द्वारा बताया जा चुका है, नमक को अंतिम हैश में बदल दिया जाता है। तो इसका मतलब है कुछ बातें:

  1. एल्गोरिदम को नमक की लंबाई पता होनी चाहिए
  2. अंतिम तार में नमक की स्थिति को भी जानना चाहिए। उदाहरण के लिए यदि बाईं या दाईं ओर से एक विशिष्ट संख्या में ऑफसेट।

ये दो चीजें आमतौर पर कार्यान्वयन में कठिन होती हैं जैसे bcryptjs के लिए bcrypt कार्यान्वयन स्रोत नमक की हड्डियों को 16 के रूप में परिभाषित करता है

/**
* @type {number}
* @const
* @private
*/

var BCRYPT_SALT_LEN = 16;

इस विचार के पीछे की मूल अवधारणा को समझने के लिए अगर कोई इसे मैन्युअल रूप से करना चाहता था, तो यह नीचे के समान दिखाई देगा। मैं अपने आप से इस तरह के सामान को लागू करने की सिफारिश नहीं करता हूं जब पुस्तकालय होते हैं जो आप इसे करने के लिए प्राप्त कर सकते हैं।

var salt_length = 16;
var salt_offset = 0;

var genSalt = function(callback)
{
    var alphaNum = '0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ';
    var salt = '';
    for (var i = 0; i < salt_length; i++) {
        var j = Math.floor(Math.random() * alphaNum.length);
        salt += alphaNum[j];
    }
    callback(salt);
}

// cryptographic hash function of your choice e.g. shar2
// preferably included from an External Library (dont reinvent the wheel)
var shar2 = function(str) {
    // shar2 logic here 
    // return hashed string;
}

var hash = function(passwordText, callback)
{
    var passwordHash = null;
    genSalt(function(salt){
        passwordHash = salt + shar2(passwordText + salt);
    });

    callback(null, passwordHash);
}

var compare = function(passwordText, passwordHash, callback)
{
    var salt = passwordHash.substr(salt_offset, salt_length);
    validatedHash = salt + shar2(passwordText + salt);

    callback(passwordHash === validatedHash);   
}

// sample usage
var encryptPassword = function(user)
{
    // user is an object with fields like username, pass, email
    hash(user.pass, function(err, passwordHash){
        // use the hashed password here
        user.pass = passwordHash;
    });

    return user;
}

var checkPassword = function(passwordText, user)
{
    // user has been returned from database with a hashed password
    compare(passwordText, user.pass, function(result){
        // result will be true if the two are equal
        if (result){
            // succeeded
            console.log('Correct Password');
        }
        else {
            // failed
            console.log('Incorrect Password');
        }
    });
}

0

क्योंकि मेरा खुद से भी यही सवाल था, मुझे पता है कि आप क्या सोच रहे हैं।

"गुप्त कुंजी" जो क्रिप्टोग्राफ़िक एल्गोरिदम और "साल्ट" में उपयोग की जाती है, के बीच गलत धारणा है, जो एन्क्रिप्शन प्रक्रिया को धीमा करने और हैकर्स के लिए जानवर बल का उपयोग करने के लिए कठिन बना देता है।

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

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