محافظت از رمزهای عبور کاربران یکی از مهمترین وظایف هر توسعهدهنده است. ذخیره کردن پسورد به صورت متن ساده یک فاجعه امنیتی محسوب میشود. در اکوسیستم جاوااسکریپت، کتابخانه BcryptJS امکان هش کردن امن رمزها را فراهم میکند تا حتی در صورت نشت دیتابیس، پسوردها قابل استفاده نباشند.
در این آموزش یاد میگیرید چگونه با استفاده از Node.js، Express و MongoDB یک سرور ساده بسازید که:
-
رمز عبور را به صورت هششده ذخیره کند
-
هنگام ورود کاربر، رمز را با هش ذخیرهشده مقایسه کند
پیشنیازها
برای اجرای این پروژه باید موارد زیر را داشته باشید:
-
Node.js نسخه 12 یا بالاتر
-
آشنایی با JavaScript
-
نصب Express.js
-
دیتابیس MongoDB (نسخه محلی یا Atlas)
چرا BcryptJS؟
Bcrypt یک الگوریتم هش مخصوص رمز عبور است که در برابر حملات بسیار مقاوم طراحی شده. نسخه BcryptJS پیادهسازی جاوااسکریپتی همین الگوریتم است.
مزایا:
امنیت بالا
Bcrypt عمداً کند طراحی شده. این کند بودن باعث میشود حملات brute-force بسیار سخت و زمانبر شوند.
استفاده از Salt
برای هر رمز، یک رشته تصادفی (Salt) ساخته میشود. این کار باعث میشود حتی اگر دو کاربر رمز یکسان داشته باشند، هش آنها متفاوت باشد.
استفاده آسان
بدون نیاز به درک عمیق رمزنگاری، میتوانید رمزها را ایمن کنید.
هشینگ و سالت چیست؟
Hashing (هش کردن)
تبدیل متن ساده به رشتهای غیرقابل بازگشت. ویژگیها:
-
یکطرفه است (قابل برعکس کردن نیست)
-
برای یک ورودی مشخص همیشه خروجی ثابت میدهد
-
برای ذخیره اطلاعات حساس عالی است
Salting
افزودن داده تصادفی به رمز قبل از هش شدن. این کار جلوی حملات جدول رنگینکمانی (Rainbow Table) را میگیرد.
ساختار پروژه
فایلها:
app.js
auth.js
db.js
User.jsنصب پکیجها:
npm init -y
npm install express mongoose bcryptjs nodemonاتصال به MongoDB (db.js)
const mongoose = require("mongoose");
const mongoURI = "mongodb://127.0.0.1:27017/bcrypt_database";
const connectMongo = async () => {
try {
await mongoose.connect(mongoURI);
console.log("Connected to MongoDB!");
} catch (error) {
console.error("MongoDB Error:", error.message);
}
};
module.exports = connectMongo;ساخت مدل کاربر (User.js)
const mongoose = require("mongoose");
const UserSchema = new mongoose.Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
module.exports = mongoose.model("user", UserSchema);راهاندازی سرور (app.js)
const connectToMongo = require("./db");
const express = require("express");
const app = express();
connectToMongo();
app.use(express.json());
app.use("/auth", require("./auth"));
app.listen(3300, () => {
console.log("Server running on port 3300");
});ثبتنام کاربر با هش رمز (auth.js)
const express = require("express");
const router = express.Router();
const User = require("./User");
const bcrypt = require("bcryptjs");
router.post("/signup", async (req, res) => {
const salt = await bcrypt.genSalt(10);
const secPass = await bcrypt.hash(req.body.password, salt);
const user = await User.create({
email: req.body.email,
password: secPass,
});
res.json({ user });
});ورود کاربر و مقایسه رمز
router.post("/login", async (req, res) => {
const user = await User.findOne({ email: req.body.email });
if (!user) return res.status(400).json({ error: "Invalid credentials" });
const match = await bcrypt.compare(req.body.password, user.password);
if (!match) return res.status(400).json({ error: "Invalid credentials" });
res.json({ success: "Authenticated!" });
});
module.exports = router;روند کار چگونه است؟
| تعداد Salt Rounds | سرعت هش کردن | سطح امنیت |
|---|---|---|
| ۸ تا ۱۰ | سریع | مناسب پروژههای عمومی |
| ۱۲ | متوسط | مقدار توصیهشده و متعادل |
| ۱۴ به بالا | کند | امنیت بسیار بالا، مصرف پردازش بیشتر |
-
کاربر رمز را ارسال میکند
-
سرور رمز را هش + سالت میکند
-
هش در دیتابیس ذخیره میشود
-
هنگام ورود، رمز جدید با هش قبلی مقایسه میشود
-
اگر برابر بود، کاربر احراز هویت میشود
جمعبندی
در این آموزش یاد گرفتید چطور:
-
رمزها را به صورت امن هش کنید
-
آنها را در MongoDB ذخیره کنید
-
هنگام ورود کاربر اعتبارسنجی انجام دهید
این پایه امنیتی هر سیستم احراز هویت مدرن است. برای ارتقای امنیت میتوانید توکنهای JWT، محدودسازی تلاشهای ورود و HTTPS را نیز اضافه کنید.
