নোড.বিক্রিপ.জেএস কীভাবে লবণ ছাড়াই হ্যাশ এবং প্লেইন টেক্সট পাসওয়ার্ডের তুলনা করে?


96

গিথুব থেকে :

একটি পাসওয়ার্ড হ্যাশ করতে:

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

উপরের দিক থেকে, তুলনাগুলির সাথে জড়িত কোনও লবণের মূল্য কীভাবে থাকতে পারে? আমি এখানে কি মিস করছি?

উত্তর:


99

লবণটি হ্যাশের সাথে সংযুক্ত করা হয়েছে (প্লেইন টেক্সট হিসাবে)। তুলনা ফাংশনটি হ্যাশ থেকে সহজেই লবণটি টেনে আনে এবং তারপরে এটি পাসওয়ার্ড হ্যাশ করতে এবং তুলনা সম্পাদন করতে ব্যবহার করে।


4
আমি এখনও বুঝতে পারি না। তুলনা চলাকালীন, এটি কীভাবে জানতে পারে যে হ্যাশের কোন অংশটি লবণ, যদি আপনি এটি লবণ সরবরাহ না করেন?
সোমবারের পেপার

7
বিসিআরপিট একটি স্ট্যান্ডার্ড এবং সর্বদা একই ফর্ম্যাটে হ্যাশ দিয়ে লবণকে সংযুক্ত করে। আপনি এনক্রিপ্ট করার সময় আপনি লবণ সরবরাহ করেন এবং এটি হ্যাশটিতে অন্তর্ভুক্ত হয়। bcrypt কেবলমাত্র সেই ডেটা ডিক্রিপ্ট করতে সক্ষম হবে যা মূলত bcrypt ব্যবহার করে এনক্রিপ্ট করা হয়েছিল, অন্যথায়, আপনি ঠিক বলেছেন - কোন অংশটি হ্যাশ এবং কোন অংশটি লবণের তা জানা উপায় নেই।
বিল

6
ঠিক আছে, আমরা এটি পেয়েছি: লব হ্যাশ দিয়ে সংরক্ষণ করা হয়। বিসিআরপিট ওপেন সোর্স, সুতরাং এর অর্থ সকলেই জানেন যে এটি ঠিক কীভাবে এটি সঞ্চয় করে। সুতরাং আপনি কীভাবে এটি নিষ্কাশন করতে পারবেন, বা কীভাবে সরল পাঠ্য পাসওয়ার্ড থেকে হ্যাশ তৈরি করবেন তা আপনি জানেন। এটি হ্যাশগুলির জন্য রেনবো টেবিলগুলি স্ক্যান করার বিরুদ্ধে পাসওয়ার্ডগুলি সুরক্ষিত করতে কীভাবে সহায়তা করে, যা মূলত লবণের পিছনে মূল ধারণা?
ভিতালিয়া লেবেদেভ

13
আক্রমণকারী কোনও নির্দিষ্ট হ্যাশের জন্য লবণের বিষয়টি জানে কিনা তা বিবেচ্য নয়, এটি কোনও গোপন বিষয় নয়। প্রতিটি পাসওয়ার্ডের জন্য আলাদা লবণ ব্যবহার করার অর্থ আক্রমণকারী সাধারণ মানগুলি ব্যবহার করে হ্যাশগুলিকে সামঞ্জস্য করতে পারে না। প্রত্যেকটিতে আলাদা আলাদা লবণের সাথে তাদের প্রতিটি পাসওয়ার্ডের জন্য যে কোনও টেবিলগুলি আবার অকার্যকর করে তুলতে হবে।
বিল

4
এইভাবে দেখুন, আক্রমণকারী যদি এই জাতীয় ডেটা বেসে নির্দিষ্ট ব্যবহারকারীর জন্য লবণের বিষয়টি জানে তবে কী তা বিবেচনা করে: 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');
        }
    });
}

1

আমার নিজেও একই প্রশ্ন ছিল বলে আপনি কী ভাবছেন তা আমি ঠিক জানি।

"সিক্রেট কী" এর মধ্যে আপনার একটি ভুল ধারণা রয়েছে যা ক্রিপ্টোগ্রাফিক অ্যালগরিদম এবং "সল্ট" -এ ব্যবহৃত হয় যা এনক্রিপশন প্রক্রিয়াটি ধীর করতে এবং হ্যাকারদের ব্রুট ফোর্স ব্যবহার করা আরও শক্ত করে তুলতে ব্যবহৃত হয়।

আপনি যখন হ্যাশ তৈরির জন্য সরল পাসওয়ার্ড এবং লবণ ব্যবহার করেন , তখন এই হ্যাশটি গোপনীয় কী হিসাবে পাসওয়ার্ড ব্যবহার করে ! পরের বার আপনি এটি একটি সরল পাসওয়ার্ডের সাথে তুলনা করার চেষ্টা করবেন, এই সরল পাসওয়ার্ডটি অবশ্যই হ্যাশ তৈরির জন্য একই ব্যবহার করা উচিত! সুতরাং এ কারণেই আপনাকে এটি অন্য কোথাও সঞ্চয় করতে হবে না কারণ এটি সর্বদা ব্যবহারকারী দ্বারা রেজিস্টার এবং লগইন পদক্ষেপগুলিতে সর্বদা সরবরাহ করা হয়!


1

Bcrypt লবণের স্ট্রিং ছাড়াই হ্যাশ এবং প্লেইন টেক্সট পাসওয়ার্ডগুলির তুলনা করুন কারণ হ্যাশ পাসওয়ার্ডে লবণের স্ট্রিং রয়েছে যা আমরা হ্যাশিংয়ের সময় তৈরি করেছি।

উদাহরণ স্বরূপ :

এই সরল পাসওয়ার্ড নিন:

546456546456546456456546111

Bcrypt ব্যবহার করে উপরের সরল পাঠ্যের পাসওয়ার্ড

B 2 বি $ 10 $ uuIKmW3Pvme9tH8qOn / H7uZqlv9ENS7zlIbkMvCSDIv7aup3WNH9W

সুতরাং উপরের হ্যাশ পাসওয়ার্ডে, তিনটি ক্ষেত্র রয়েছে $ চিহ্ন দ্বারা সীমাবদ্ধ ।

i) প্রথম অংশ $ 2 বি used ব্যবহৃত বিস্রিপ্ট অ্যালগরিদম সংস্করণ সনাক্ত করে।

ii) দ্বিতীয় অংশ $ 10 $ 10 হ'ল ব্যয় (আমাদের লবণের স্ট্রিং তৈরি করার সময় লবণের গোলগুলি ছাড়া কিছুই নয় we আমরা যদি 15 টি রাউন্ড করি তবে মানটি 15 ডলার হবে)

iii) তৃতীয় অংশটি প্রথম 22 টি অক্ষর (এটি লবণের স্ট্রিং ছাড়া কিছুই নয়) এই ক্ষেত্রে এটি

uuIKmW3Pvme9tH8qOn / H7u

বাকি স্ট্রিং হ্যাশ পাসওয়ার্ড হয়। সুতরাং মূলত, স্যালটেডহ্যাশ = লবণের স্ট্রিং + হ্যাশপ্যাসওয়ার্ডটি রেইনবো টেবিলের আক্রমণ থেকে রক্ষা করতে।


1

এটি কেবল একটি নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং।

console.log("");
var salt = bcrypt.genSaltSync(10);
console.log(salt);
hash = bcrypt.hashSync("foobar", salt);
console.log(hash);

console.log("");
var salt = bcrypt.genSaltSync(10);
console.log(salt);
hash = bcrypt.hashSync("foobar", salt);
console.log(hash);

console.log("");
var salt = bcrypt.genSaltSync(10);
console.log(salt);
hash = bcrypt.hashSync("foobar", salt);
console.log(hash);
$2a$10$onmcKV.USxnoQAsQwBFB3e
$2a$10$onmcKV.USxnoQAsQwBFB3eytL3UZvZ5v/SudaWyaB9Vuq9buUqGO2

$2a$10$mwQfdyVS9dsO4SuxoR5Ime
$2a$10$mwQfdyVS9dsO4SuxoR5ImeG7atz7RXGRXb.c0VHp5zSn1N2VOA.Vq

$2a$10$uVUuJr6LryjchhKEg6PH7u
$2a$10$uVUuJr6LryjchhKEg6PH7unTw8aJGK0i3266c5kqDBLJkf80RHEpq

$2a$10$Y.upG5/54zvJyZacRxP17O
$2a$10$Y.upG5/54zvJyZacRxP17OH60BC0hQRMNfQjJxSWE77fyBrbzalmS

0

লবণের মিশ্রণটি হ্যাশের সাথে যুক্ত করা হয়। তুলনা ফাংশনটি হ্যাশ থেকে সহজেই লবণটি টেনে আনে এবং তারপরে এটি পাসওয়ার্ড হ্যাশ করতে এবং তুলনা সম্পাদন করতে ব্যবহার করে।

যখন কোনও ব্যবহারকারী আমাদের সিস্টেমে লগইন করবেন, তখন প্রবেশ করা পাসওয়ার্ডটি সঠিক কিনা তা আমাদের পরীক্ষা করা উচিত। অন্যান্য সিস্টেমে যেগুলি ডাটাবেসে পাসওয়ার্ডটি ডিক্রিপ্ট করে না (যদি এটি এনক্রিপ্ট করা থাকে) এবং এটি ব্যবহারকারীর দ্বারা প্রবেশ করা একটিটির সাথে তুলনা করে, আমি বিসিআরপিট দিয়ে যা করি (এটি দিয়ে ওয়ান-ওয়ে হ্যাশিং প্রয়োগ করা হয়) এটি দ্বারা প্রবেশ করা এনক্রিপ্ট হয় ব্যবহারকারী এটি করার জন্য, আমি পাসওয়ার্ডটি হ্যাশ গণনা করতে bcrypt এ পাসওয়ার্ড দিয়ে দেব, তবে ব্যবহারকারীর (হ্যাশ) সাথে সম্পর্কিত ডাটাবেসে সংরক্ষণ করা পাসওয়ার্ডও। এটি কারণ হিসাবে আগেই বলা হয়েছে, বিক্রিপ্ট আলগোরিদিম পাসওয়ার্ডের সাথে সম্পর্কিত হ্যাশ তৈরি করতে একটি এলোমেলোভাবে বিভাগ (লবণ) ব্যবহার করেছিল। এটি পাসওয়ার্ড সহ সংরক্ষণ করা হয়েছিল এবং আপনার ব্যবহারকারীর দ্বারা প্রবেশ করা পাসওয়ার্ডের হ্যাশটি পুনরায় গণনা করতে হবে এবং অবশেষে নিবন্ধের সাথে প্রবেশ করা পাসওয়ার্ডের সাথে তুলনা করুন এবং দেখুন কিনা সেগুলি মিলছে কিনা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.