یکی از بهترین راه ها برای ذخیره ایمن رمزهای عبور، نمک زدن و هش کردن آنهاست. Salting و هش کردن یک رمز عبور ساده را به یک مقدار منحصر به فرد تبدیل می کند که به سختی قابل برگشت است. کتابخانه Bcrypt به شما این امکان را میدهد تا با تلاش بسیار کم، رمزهای عبور را در Node.js هش و سالت کنید.
یکی از بهترین راه ها برای ذخیره ایمن رمزهای عبور، نمک زدن و هش کردن آنهاست. Salting و هش کردن یک رمز عبور ساده را به یک مقدار منحصر به فرد تبدیل می کند که به سختی قابل برگشت است. کتابخانه Bcrypt به شما این امکان را میدهد تا با تلاش بسیار کم، رمزهای عبور را در Node.js هش و سالت کنید.
هش کردن رمز عبور چیست؟
هش کردن رمز عبور به معنای عبور یک رمز عبور متن ساده از طریق یک الگوریتم هش برای ایجاد یک مقدار منحصر به فرد است. این مقدار منحصر به فرد هش نامیده می شود. برخی از نمونههایی از الگوریتمهای هش عبارتند از bcrypt، scrypt و SHA.
یکی از ویژگی های اصلی یک الگوریتم هش خوب این است که خروجی یکسانی را برای ورودی یکسان تولید می کند. این قابلیت پیش بینی هش ها را در برابر حملات brute-force آسیب پذیر می کند. یک هکر می تواند مقادیر هش را برای بسیاری از ورودی های رایج از قبل محاسبه کند و سپس آنها را با مقادیر هش در مقادیر هدف مقایسه کند. با استفاده از نمک می توانید این آسیب پذیری را کاهش دهید.
نمک زدن رمز عبور چیست؟
رمز عبور یک رشته تصادفی (نمک) را قبل از هش کردن رمز عبور اضافه می کند. به این ترتیب، هش تولید شده همیشه در هر بار متفاوت خواهد بود. حتی اگر یک هکر رمز عبور هش شده را به دست آورد، زمان قابل توجهی برای کشف رمز عبور اصلی که آن را ایجاد کرده است، از او خواهد گرفت.
نحوه استفاده از Bcrypt برای هش و تأیید رمز عبور
bcrypt یک ماژول npm است که روش هش رمزهای عبور در Node.js را ساده می کند. برای استفاده از آن مراحل زیر را دنبال کنید:
مرحله 1: Bcrypt را نصب کنید
با اجرای دستورات ترمینال زیر، bcrypt را نصب کنید.
استفاده از npm:
npm install bcrypt
استفاده از نخ:
yarn add bcrypt
مرحله 2: وارد کردن Bcrypt
در بالای فایل جاوا اسکریپت، Bcrypt را وارد کنید.
const bcrypt = require("bcrypt")
مرحله 3: یک نمک تولید کنید
برای تولید نمک، متد ()bcrypt.genSalt را فراخوانی کنید. این روش یک مقدار صحیح را می پذیرد که عامل هزینه است که زمان صرف شده برای هش رمز عبور را تعیین می کند. هرچه ضریب هزینه بیشتر باشد، الگوریتم زمان بیشتری می برد و معکوس کردن رمز عبور رمزگذاری شده با استفاده از نیروی بی رحم دشوارتر است.
یک مقدار خوب باید به اندازه کافی بالا باشد تا رمز عبور را ایمن کند، اما همچنین به اندازه ای کم باشد که روند را کند نکند. معمولاً بین 5 تا 15 است. در این آموزش از 10 استفاده خواهیم کرد.
bcrypt.genSalt(10, (err, salt) => {
// use salt to hash password
})
مرحله 4: رمز عبور را هش کنید
در تابع bcrypt.genSalt، رمز عبور ساده و نمک تولید شده را به متد ()bcrypt.hash ارسال کنید تا رمز عبور را هش کنید.
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(plaintextPassword, salt, function(err, hash) {
// Store hash in the database
});
})
هنگامی که هش را ایجاد کردید، آن را در پایگاه داده ذخیره کنید. شما از آن برای تایید رمز عبور و احراز هویت کاربری که سعی در ورود به سیستم را دارد استفاده خواهید کرد.
به جای تولید نمک و هش جداگانه، می توانید نمک و هش را نیز با استفاده از یک تابع به طور خودکار تولید کنید.
bcrypt.hash(plaintextPassword, 10, function(err, hash) {
// store hash in the database
});
مرحله 5: مقایسه رمزهای عبور با استفاده از bcrypt
برای احراز هویت کاربران، باید رمز عبوری که آنها ارائه میکنند را با رمز عبور موجود در پایگاه داده با استفاده از تابع ()bcrypt.compare مقایسه کنید. این تابع رمز عبور متن ساده و هش ذخیره شده شما را به همراه یک تابع تماس می پذیرد. این فراخوانی یک شی حاوی هر گونه خطای رخ داده و نتیجه کلی از مقایسه را فراهم می کند. اگر رمز عبور با هش مطابقت داشته باشد، نتیجه درست است.
bcrypt.compare(plaintextPassword, hash, function(err, result) {
if (result) {
// password is valid
}
});
استفاده از Async/Await
می توانید رمزهای عبور در Node.js را با استفاده از async/await به صورت زیر با Bcrypt رمزگذاری کنید.
async function hashPassword(plaintextPassword) {
const hash = await bcrypt.hash(plaintextPassword, 10);
// Store hash in the database
}
// compare password
async function comparePassword(plaintextPassword, hash) {
const result = await bcrypt.compare(plaintextPassword, hash);
return result;
}
استفاده از وعده ها
کتابخانه bcrypt نیز از استفاده از وعده ها پشتیبانی می کند. به عنوان مثال، در اینجا تابعی است که رمز عبور را با استفاده از بلوک then…catch هش می کند.
function hashPassword(plaintextPassword) {
bcrypt.hash(plaintextPassword, 10)
.then(hash => {
// Store hash in the database
})
.catch(err => {
console.log(err)
})
}
به همین ترتیب، این تابع یک رمز عبور ساده از کاربر را با یک رمز عبور هش شده با استفاده از وعده ها مقایسه می کند.
function comparePassword(plaintextPassword, hash) {
bcrypt.compare(plaintextPassword, hash)
.then(result => {
return result
})
.catch(err => {
console.log(err)
})
}
هش کردن و نمک زدن یک پیروزی آسان است
میتوانید از کتابخانه Bcrypt برای هش و تأیید رمزهای عبور در Node.js استفاده کنید. هش کردن رمزهای عبور، احتمال دسترسی مجرمان سایبری به رمزهای عبور ساده و استفاده از آنها برای دسترسی به دادهها یا خدمات حساس را به حداقل میرساند.
نمک زدن گذرواژههای هششده شما، امنیت آنها را حتی بیشتر میکند. جدا از هش کردن، همیشه قدرت رمز عبور را به عنوان یک اقدام امنیتی اضافی تأیید کنید.