Bcrypt لجافا سكريبت (Node.js): دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Bcrypt لجافا سكريبت (Node.js): دليل شامل

1. ما هو Bcrypt ولماذا تحتاجه

Bcrypt هي دالة تجزئة (hash) تشفيرية تكيفية، صُممت خصيصًا لتخزين كلمات المرور بشكل آمن. على عكس دوال التجزئة العادية (MD5, SHA-1, SHA-256) التي صُممت للسرعة، فإن Bcrypt بطيء ومستهلك للموارد عن قصد. هذا يجعل هجمات التخمين (brute-force) وهجمات جداول قوس قزح (rainbow tables) شبه مستحيلة. توفر مكتبة bcrypt لـ Node.js واجهة بسيطة وموثوقة لتجزئة كلمات المرور والتحقق منها.

لماذا نستخدم Bcrypt؟ عند تسجيل مستخدم في موقع، يجب ألا يُخزَّن كلمة المرور أبدًا كنص صريح. إذا تم اختراق قاعدة البيانات، سيحصل المهاجم على جميع كلمات المرور. يحل Bcrypt هذه المشكلة: تقوم بتجزئة كلمة المرور مع "ملح" (salt) فريد وتخزين التجزئة فقط. عند تسجيل دخول المستخدم، تقوم بتجزئة كلمة المرور المدخلة مرة أخرى ومقارنتها بالتجزئة المخزنة. يقوم Bcrypt تلقائيًا بإنشاء الملح ودمجه في النتيجة، لذا لا تحتاج لتخزينه بشكل منفصل.

الميزة الأساسية لـ Bcrypt هي إمكانية التحكم في "عامل التكلفة" (cost factor). كلما زادت قيمة cost، زاد الوقت اللازم لحساب التجزئة. مع تزايد القوة الحاسوبية، يمكنك ببساطة زيادة cost، وستظل التجزئات القديمة صالحة (أثناء التحقق، تُستخدم cost المخزنة في التجزئة). هذا يجعل Bcrypt مقاومًا للتقدم المستقبلي في مجال تسريع الأجهزة.

2. التثبيت

لتثبيت مكتبة Bcrypt في مشروع Node.js، قم بتنفيذ الأمر التالي في الطرفية (في المجلد الجذر للمشروع):

npm install bcrypt

بعد التثبيت، يمكنك استيراد المكتبة في الكود الخاص بك:

const bcrypt = require('bcrypt');

إذا كنت تستخدم وحدات ES (type: "module" في ملف package.json)، سيكون الاستيراد كالتالي:

import bcrypt from 'bcrypt';

3. بداية سريعة — مثال عملي بسيط

في هذا المثال، سنقوم بتجزئة كلمة مرور ثم التحقق منها. هذه هي الأساس لأي نظام مصادقة.

const bcrypt = require('bcrypt');

const plainPassword = 'mySuperSecretPassword123!';
const saltRounds = 10;

// تجزئة كلمة المرور
bcrypt.hash(plainPassword, saltRounds, function(err, hash) {
    if (err) {
        console.error('خطأ في التجزئة:', err);
        return;
    }
    console.log('تجزئة كلمة المرور:', hash);

    // التحقق من كلمة المرور
    bcrypt.compare(plainPassword, hash, function(err, result) {
        if (err) {
            console.error('خطأ في المقارنة:', err);
            return;
        }
        console.log('كلمة المرور متطابقة:', result); // true
    });
});

يقوم هذا الكود بأمرين: إنشاء تجزئة لكلمة المرور ثم التحقق مما إذا كانت كلمة المرور الأصلية تطابق هذه التجزئة. لاحظ أن saltRounds يحدد مدى تعقيد العمليات الحسابية (القيمة الموصى بها هي 10–12).

4. الطرق/الدوال/الفئات الأساسية

4.1. bcrypt.hash(data, saltOrRounds, callback)

التوقيع: bcrypt.hash(data: string | Buffer, saltOrRounds: number | string, callback: (err: Error | null, encrypted: string) => void): void

الوظيفة: تقوم بتجزئة سلسلة نصية أو Buffer بشكل غير متزامن. يمكن أن يكون saltOrRounds رقمًا (عدد الجولات) أو ملحًا جاهزًا (سلسلة نصية). تُرجع التجزئة عبر callback.

مثال:

bcrypt.hash('password123', 12, (err, hash) => {
    if (err) throw err;
    console.log(hash); // $2b$12$...
});

4.2. bcrypt.hashSync(data, saltOrRounds)

التوقيع: bcrypt.hashSync(data: string | Buffer, saltOrRounds: number | string): string

الوظيفة: النسخة المتزامنة من

توصيات