كيف تقوم Node بتنفيذ التشفير وفك التشفير لنقل البيانات؟ ستقدم لك المقالة التالية كيفية تنفيذ Node.js للتشفير وفك التشفير لنقل البيانات الأمامية والخلفية، وآمل أن يكون ذلك مفيدًا لك!
دورة المقدمة السريعة لـ Node.js: أدخل لتتعلم
أثناء عملية الاتصال الأمامية والخلفية، تحتاج بعض المعلومات الحساسة، وخاصة حساب المستخدم وكلمة المرور، إلى التشفير للإرسال، كما أن كيفية اختيار طريقة التشفير هي أيضًا علم، ولكن ليست هناك حاجة للذهاب إلى أبعد من ذلك هنا. بشكل عام، تشفير بيانات النقل الأكثر استخدامًا في بنية B/S هو تشفير RSA. الفكرة الأساسية هي تشفير المفتاح العام وفك تشفير المفتاح الخاص . يمكن فهم المفتاح العام على أنه مفتاح يمكن جعله عامًا. يرسل الخادم المفتاح العام إلى العميل. يستخدم العميل المفتاح العام لتشفير البيانات ونقلها. يتلقى الخادم النص المشفر من العميل ثم يستخدمه قم بفك تشفير المفتاح الخاص المقترن للحصول على البيانات الأصلية.
تظهر العملية العامة في الشكل أدناه:
توجد وحدة أساسية في Nodejs - crypto
والتي توفر العديد من واجهات برمجة التطبيقات ذات الصلة بالتشفير وفك التشفير. تمت كتابة الأمثلة التالية بناءً على الإصدار [email protected]
.
const crypto = require('crypto'); /** * إنشاء أزواج مفاتيح عامة وخاصة لـ RSA * @return {*} publicKey: المفتاح العام: المفتاح الخاص */ الدالة جينRSAKeyPaire() { const { publicKey, PrivateKey } = crypto.generateKeyPairSync('rsa', { طول المعامل: 4096, ترميز المفتاح العام: { النوع: "pkcs1"، التنسيق: "بيم"، }, ترميز المفتاح الخاص: { النوع: "pkcs1"، التنسيق: "بيم"، }, }); العودة {مفتاح عام، مفتاح خاص}؛ } // اطبع أزواج المفاتيح العامة والخاصة التي تم إنشاؤها console.log(genRSAKeyPaire());
مثال الإخراج هو كما يلي:
(تم حذف جزء من نموذج المفاتيح العامة والخاصة، يرجى عدم استخدامه للتجارب)
{ publicKey: '-----بدء مفتاح RSA العام-----n' + 'MIICCgKCAgEAsitohTu9Jf2h+NPV4tNfFhPrlbStzXNM8wSEcskwtpwi6aZfgQC7n' + '/A7M1hN8Zk8WgiZjy05AHinWPvXo70OWj8TminIAjB2wh0nDqm+IQqN7r20uzeJmn' + 'GBf1KusGemChEiFwiad1h/OB9z9LC8zMYR/G+XAbFfcv8MxAMI9mgmS8t5+xeYm6n' + 'EMiCQkQjfqpErhW3oESj8hrdJdOZbiK3l0TgYLyjZRQu6pHzFkmd9We3BY1qcXo1n' + '2BtNKvqoH9QDJItsb3S9v2mOGl1rbItKlDrqYCdGY4iyXVIIfagNWHraVzHqH/tern' + 'X+hOmLOwu+Npkz+oEDmnUq1UGY181PBGiNwHVodXx+DF5ckj/bGIxFG2nSiNe3dOn' + 'WLxV3+W8Af0006Oe+fRo1D7xt5SK5AipCpylKKYdyuP3MJ5dpPu7GMIcwj20Ndnun' + 'cDJJ2HH9kZAKz6/r62S7ALLuFSecuZr0Dqc6SrJs43zBTpS/hSI33r01ste6Zel8n' + 'uRZKW/4FhUg8gW1KCM+Mp1MaZufOURCDc1Iec0SI71Tteg52BTpfb8cQ9Z1h0xWRn' + 'FdbmLMLuJkIi5oG2+FLAqlGknik0AxXpnlivSOW5Q+eLOh0DjQxxU2sCAwEAAQ==n' + '-----المفتاح العام لـ RSA-----n', مفتاح خاص: '-----بدء مفتاح RSA الخاص-----n' + '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' + '-----المفتاح الخاص لنهاية RSA-----n' }
2. تشفير المفتاح العام
بناءً على زوج المفاتيح العامة والخاصة، يتم استخدام المفتاح العام للتشفير. نموذج التعليمات البرمجية كما يلي:
const crypto = require('crypto'); /** * إنشاء زوج مفاتيح عام وخاص * @return {*} publicKey: المفتاح العام: المفتاح الخاص */ الدالة جينRSAKeyPaire() { const { publicKey, PrivateKey } = crypto.generateKeyPairSync('rsa', { طول المعامل: 4096, ترميز المفتاح العام: { النوع: "pkcs1"، التنسيق: "بيم"، }, ترميز المفتاح الخاص: { النوع: "pkcs1"، التنسيق: "بيم"، }, }); العودة {مفتاح عام، مفتاح خاص}؛ } const { publicKey } = genRSAKeyPaire(); /** * استخدم المفتاح العام للتشفير * بياناتparam {String}. * @param {String} publicKey * @return {String} نص مشفر مشفر */ وظيفة publicKeyEncrypt(data, publicKey) { إرجاع crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } إدخال ثابت = { الاسم: "زانغسان"، كلمة المرور: '123456' }; // تحويل البيانات إلى تنسيق سلسلة وإجراء تشفير المفتاح العام وطباعة console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));
محتوى الإخراج بالتنسيق التالي:
(تم حذف البيانات)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu2VyFsIS /6DeEWYNirPK6zEBw1e2V2jWoL+63+iGNyhtKFJI1ECGyMmXUWCMicUmgE/JiHJD7YXPKB9+WaB7Wglj5udBdd4fALUp7qIo8TWJZJkLUg5yMbe7kemNWk050Xi1KiEt3s8IAqoRB1qGghTmE/TW +M/jIblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sdocVbhsiSlpFLpIk88 xd4=
3. فك تشفير المفتاح الخاص
مع النص المشفر المشفر بواسطة المفتاح العام، استخدم المفتاح الخاص لفك تشفيره كما يلي:
const crypto = require('crypto'); /** * إنشاء زوج مفاتيح عام وخاص * @return {*} publicKey: المفتاح العام: المفتاح الخاص */ الدالة جينRSAKeyPaire() { const { publicKey, PrivateKey } = crypto.generateKeyPairSync('rsa', { طول المعامل: 4096, ترميز المفتاح العام: { النوع: "pkcs1"، التنسيق: "بيم"، }, ترميز المفتاح الخاص: { النوع: "pkcs1"، التنسيق: "بيم"، }, }); العودة {مفتاح عام، مفتاح خاص}؛ } const { publicKey, PrivateKey } = genRSAKeyPaire(); /** * استخدم المفتاح العام للتشفير * بياناتparam {String}. * @param {String} publicKey * @return {String} نص مشفر مشفر */ وظيفة publicKeyEncrypt(data, publicKey) { إرجاع crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64') } إدخال ثابت = { الاسم: "زانغسان"، كلمة المرور: '123456' }; const encryptedData = publicKeyEncrypt(JSON.stringify(entry), publicKey); /** * فك التشفير باستخدام المفتاح الخاص * @param {String} البيانات المشفرة * @param {String} مفتاح خاص * @return {String} نص عادي تم فك تشفيره */ وظيفة PrivateKeyDecrypt(encryptedData, PrivateKey) { return crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'base64')).toString(); } const OriginData = PrivateKeyDecrypt(encryptedData, PrivateKey); // اطبع البيانات التي تم فك تشفيرها باستخدام المفتاح الخاص console.log(originData);
نتيجة الإخراج:
{"اسم": "زهانجسان"، "كلمة المرور": "123456"}
محتوى بيانات entry
التي حددناها أعلاه متسق، مما يشير إلى أن فك التشفير ناجح، ولكن فك التشفير عبارة عن سلسلة. إذا كانت البيانات الأصلية كائنًا، فلا تنس إلغاء تسلسلها وتحويلها إلى كائن.
في التطوير اليومي، عندما يتعلق الأمر بالاتصالات الأمامية والخلفية، وخاصة المعلومات المهمة، من أجل منع الأطراف الثالثة من الحصول عليها واستخدامها، يتم تنفيذ تشفير نقل الاتصالات بشكل عام، وأبسطها هو استخدام بروتوكول https
لكن بروتوكول https وحده لا يكفي (من السهل أن يتم اختطافه ومهاجمته من قبل رجل في المنتصف). لذلك، يجب تشفير البيانات في طبقة التطبيق لمنع اختطاف البيانات واستخدامها من قبل الآخرين. يمكن أن يضمن استخدام التشفير غير المتماثل أن النص المشفر المرسل لا يمكن فك تشفيره إلا بواسطة الخادم باستخدام المفتاح الخاص، وبالتالي منع النص المشفر من أن يكون. تم فك تشفيرها واستخدامها من قبل أطراف أخرى غير ذات صلة. لا يوجد أمان مطلق في مجال الإنترنت، والحل الوحيد على المدى الطويل هو التحسين المستمر لوعيك الأمني وتعزيز مهاراتك الأمنية.