التشفير في Node.js: الوحدة المدمجة crypto
في تطوير الويب الحديث، أمان البيانات هو جانب بالغ الأهمية. توفر Node.js وحدة مدمجة قوية ومرنة crypto، والتي تنفذ مجموعة واسعة من وظائف التشفير. لا تتطلب هذه الوحدة تثبيت حزم إضافية وتسمح بحل مهام التجزئة، التشفير المتماثل وغير المتماثل، إنشاء التوقيعات الرقمية و HMAC (رمز مصادقة الرسالة القائم على التجزئة).
في هذه المقالة، سنشرح بالتفصيل الإمكانيات الرئيسية لـ crypto وسنقدم أمثلة عملية على الكود.
الإمكانيات الرئيسية للوحدة crypto
- التجزئة — تحويل البيانات ذات الطول العشوائي إلى سلسلة ذات طول ثابت (SHA-256، SHA-512، MD5).
- التشفير المتماثل — التشفير وفك التشفير باستخدام مفتاح سري واحد (AES-256-CBC، AES-192-GCM).
- التشفير غير المتماثل — التشفير باستخدام زوج من المفاتيح (عام/خاص) بناءً على RSA أو ECDH.
- HMAC — التجزئة باستخدام مفتاح سري للتحقق من سلامة وصحة الرسالة.
- التوقيعات الرقمية — إنشاء والتحقق من التوقيعات لتأكيد هوية المؤلف.
استيراد الوحدة
الوحدة crypto مدمجة في Node.js، لذلك يتم استيرادها بالطريقة القياسية:
const crypto = require('crypto');مثال 1: تجزئة البيانات (SHA-256)
التجزئة هي دالة أحادية الاتجاه، تُستخدم غالبًا لتخزين كلمات المرور والتحقق من سلامة الملفات.
const data = 'PythonLib — بوابة تعليمية';
// إنشاء تجزئة SHA-256const hash = crypto.createHash('sha256');hash.update(data);const hexHash = hash.digest('hex');
console.log('البيانات الأصلية:', data);console.log('تجزئة SHA-256:', hexHash);// الإخراج: تجزئة SHA-256: b5a1... (64 حرفًا)هام: لتخزين كلمات المرور، استخدم ليس تجزئة بسيطة، بل دالة مع "ملح" — على سبيل المثال، crypto.scryptSync() أو pbkdf2Sync().
مثال 2: تجزئة كلمة المرور مع الملح (scrypt)
const password = 'MySecurePassword123';
// توليد ملح عشوائيconst salt = crypto.randomBytes(16).toString('hex');
// إنشاء تجزئة مع الملح (scrypt)const hash = crypto.scryptSync(password, salt, 64).toString('hex');
console.log('الملح:', salt);console.log('تجزئة كلمة المرور:', hash);
// للتحقق، نستخدم نفس الملح ونقارن التجزئاتconst isMatch = crypto.scryptSync(password, salt, 64).toString('hex') === hash;console.log('كلمة المرور متطابقة:', isMatch); // trueمثال 3: التشفير المتماثل AES-256-CBC
يستخدم التشفير المتماثل مفتاحًا واحدًا للتشفير وفك التشفير. تتطلب خوارزمية AES-256-CBC أيضًا متجه تهيئة (IV).
// دالة التشفيرfunction encrypt(text, key) { const iv = crypto.randomBytes(16); // توليد IV const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { iv: iv.toString('hex'), encrypted };}
// دالة فك التشفيرfunction decrypt(encrypted, key, ivHex) { const iv = Buffer.from(ivHex, 'hex'); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}
// الاستخدامconst key = crypto.randomBytes(32); // مفتاح 256 بتconst secretMessage = 'بيانات سرية لـ PythonLib';
const encryptedData = encrypt(secretMessage, key);console.log('مُشفّر:', encryptedData.encrypted);console.log('IV:', encryptedData.iv);
const decryptedMessage = decrypt(encryptedDa