التشفير في Node.js: وحدة crypto للتشفير والتجزئة
في تطوير الويب الحديث، أمان البيانات هو جانب بالغ الأهمية. توفر Node.js وحدة مدمجة crypto، والتي تنفذ وظائف التشفير، بما في ذلك التشفير المتماثل وغير المتماثل، والتجزئة، بالإضافة إلى حساب رموز مصادقة الرسائل (HMAC). في هذه المقالة، سنشرح بالتفصيل الإمكانيات الرئيسية لوحدة crypto مع أمثلة عملية.
التثبيت والاستيراد
وحدة crypto هي جزء من المكتبة القياسية لـ Node.js، لذلك لا يلزم تثبيت إضافي. للاستخدام، يكفي استيرادها:
const crypto = require('crypto');تجزئة البيانات
التجزئة هي تحويل أحادي الاتجاه للبيانات إلى سلسلة ذات طول ثابت. الخوارزمية الأكثر شيوعًا هي SHA-256. تُستخدم التجزئات للتحقق من سلامة البيانات وتخزين كلمات المرور (بالاشتراك مع الملح).
const data = "رسالة سرية";const hash = crypto.createHash('sha256') .update(data) .digest('hex');
console.log(`SHA-256 hash: ${hash}`);// الإخراج: سلسلة مكونة من 64 حرفًالزيادة أمان كلمات المرور، استخدم دائمًا الملح (salt) وخوارزمية PBKDF2 أو bcrypt. مثال مع PBKDF2:
const password = "كلمة_مرور_المستخدم";const salt = crypto.randomBytes(16).toString('hex');
crypto.pbkdf2(password, salt, 100000, 64, 'sha512', (err, derivedKey) => { if (err) throw err; console.log(`تجزئة كلمة المرور: ${derivedKey.toString('hex')}`); console.log(`الملح: ${salt}`);});التشفير المتماثل (AES)
يستخدم التشفير المتماثل نفس المفتاح للتشفير وفك التشفير. الخوارزمية الأكثر شيوعًا هي AES (معيار التشفير المتقدم). سننظر في التشفير وفك التشفير باستخدام AES-256-CBC.
const algorithm = 'aes-256-cbc';const key = crypto.randomBytes(32); // مفتاح 256 بتconst iv = crypto.randomBytes(16); // متجه التهيئة
// التشفيرfunction encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { iv: iv.toString('hex'), encryptedData: encrypted };}
// فك التشفيرfunction decrypt(encryptedData, ivHex) { const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encryptedData, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}
// مثال على الاستخدامconst message = "بيانات سرية";const encrypted = encrypt(message);console.log(`مُشفّر: ${encrypted.encryptedData}`);
const decrypted = decrypt(encrypted.encryptedData, encrypted.iv);console.log(`مفكوك التشفير: ${decrypted}`);هام: لا تستخدم أبدًا نفس IV لرسائل مختلفة. قم بإنشاء IV عشوائي جديد لكل عملية تشفير.
التشفير غير المتماثل (RSA)
يستخدم التشفير غير المتماثل زوجًا من المفاتيح: مفتاح عام (public) للتشفير ومفتاح خاص (private) لفك التشفير. RSA هي الخوارزمية الأكثر شيوعًا.
const { generateKeyPairSync, publicEncrypt, privateDecrypt } = crypto;
// توليد المفاتيحconst { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' }});
// التشفير بالمفتاح العامconst dataToEncrypt = "رسالة سرية لـ RSA";const encryptedData = publicEncrypt(publicKey, Buffer.from(dataToEncrypt));console.log(`مُشفّر RSA: ${encryptedData.toString('base64')}`);
// فك التشفير بالمفتاح الخاصconst decryptedData = privateDecrypt(privateKey, encryptedData);co