التشفير في Node.js: التشفير والتجزئة باستخدام وحدة crypto
أمان البيانات هو أحد الجوانب الرئيسية في تطوير الويب الحديث. في Node.js، توفر الوحدة المدمجة crypto أدوات قوية للحماية التشفيرية: من تجزئة كلمات المرور إلى التشفير غير المتماثل. في هذه المقالة، سنشرح بالتفصيل الوظائف الرئيسية لوحدة crypto، ونتعلم كيفية تشفير وفك تشفير البيانات، وكذلك تخزين كلمات المرور بأمان باستخدام التجزئة.
1. استيراد وحدة crypto
وحدة crypto هي وحدة مدمجة، لذا لا تتطلب تثبيت حزم إضافية. يتم استيرادها بالطريقة القياسية:
const crypto = require('crypto');2. تجزئة البيانات
التجزئة هي عملية تحويل البيانات ذات الطول المتغير إلى سلسلة ذات طول ثابت. على عكس التشفير، دالة التجزئة لا رجعة فيها. الخوارزميات الأكثر شيوعًا: SHA-256، SHA-512.
مثال: تجزئة سلسلة باستخدام SHA-256
const data = 'PythonLib — دليلك في عالم تكنولوجيا المعلومات';const hash = crypto.createHash('sha256').update(data).digest('hex');console.log('SHA-256 hash:', hash);مثال: التجزئة مع الملح (bcrypt)
لتخزين كلمات المرور بشكل آمن، يُوصى باستخدام خوارزمية bcrypt أو scrypt. في Node.js، يوجد دعم مدمج لـ scrypt:
const password = 'mySuperPassword123';const salt = crypto.randomBytes(16).toString('hex');
crypto.scrypt(password, salt, 64, (err, derivedKey) => { if (err) throw err; console.log('Hash كلمة المرور:', derivedKey.toString('hex'));});3. التشفير المتماثل (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 };}
const originalText = 'بيانات سرية لـ PythonLib';const encrypted = encrypt(originalText);console.log('البيانات المشفرة:', encrypted);فك تشفير البيانات
function decrypt(encryptedObj) { const decipher = crypto.createDecipheriv( algorithm, key, Buffer.from(encryptedObj.iv, 'hex') ); let decrypted = decipher.update(encryptedObj.encryptedData, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}
const decryptedText = decrypt(encrypted);console.log('النص المفكوك تشفيره:', decryptedText);4. التشفير غير المتماثل (RSA)
يستخدم التشفير غير المتماثل زوجًا من المفاتيح: مفتاح عام (public) ومفتاح خاص (private). يتم تشفير البيانات بالمفتاح العام، وفك تشفيرها بالمفتاح الخاص. هذا هو أساس HTTPS والتوقيعات الرقمية.
توليد زوج مفاتيح RSA
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' }});
console.log('المفتاح العام:', publicKey);console.log('المفتاح الخاص:', privateKey);التشفير وفك التشفير باستخدام RSA
const secretMessage = 'مرحبًا، PythonLib!';
// التشفير بالمفتاح العامconst encryptedData = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(secretMessage));console.log('البيانات المشفرة:', encryptedData.toString('hex'));
// فك التشفير بالمفتاح الخاصconst decryptedData = crypto.privateDecrypt( { key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING }, encryptedData);console.log('البيانات المفكوك تشفيرها:', decryptedData.toString('utf8'));5. إنشاء التوقيعات الرقمية والتحقق منها
تسمح التوقيعات الرقمية بالتحقق من سلامة البيانات ومصدرها. يتم التوقيع باستخدام المفتاح الخاص، والتحقق باستخدام المفتاح العام.
مثال: التوقيع والتحقق
const sign = crypto.createSign('SHA256');sign.update('بيانات مهمة جدًا');sign.end();const signature = sign.sign(privateKey, 'hex');console.log('التوقيع:', signature);
const verify = crypto.createVerify('SHA256');verify.update('بيانات مهمة جدًا');verify.end();const isValid = verify.verify(publicKey, signature, 'hex');console.log('التوقيع صحيح:', isValid);الخلاصة
تعد وحدة crypto في Node.js أداة قوية ومرنة لتنفيذ مهام التشفير. لقد غطينا المفاهيم الأساسية: التجزئة، التشفير المتماثل وغير المتماثل، والتوقيعات الرقمية. تذكر دائمًا أن أمان التطبيق يبدأ بالاستخدام الصحيح للطرق التشفيرية. لمزيد من المعلومات، راجع الوثائق الرسمية لوحدة crypto.
اشترك في PythonLib للحصول على المزيد من المواد حول تطوير Node.js وأمان الويب!