Как Node реализует шифрование и дешифрование передачи данных? Следующая статья познакомит вас с тем, как Node.js реализует шифрование и дешифрование передачи данных на внешнем и внутреннем серверах. Надеюсь, она будет вам полезна! 
Краткое введение в Node.js: войдите, чтобы узнать
В процессе внешней и внутренней связи некоторая конфиденциальная информация, особенно учетная запись и пароль пользователя, должна быть зашифрована для передачи. Как выбрать метод шифрования — это тоже наука, но не нужно заходить слишком далеко. здесь. Вообще говоря, наиболее часто используемым шифрованием передаваемых данных в архитектуре B/S является шифрование RSA. Основная идея – шифрование с открытым ключом и расшифровка с закрытым ключом . Под открытым ключом можно понимать ключ, который можно сделать общедоступным. Сервер отправляет открытый ключ клиенту. Клиент использует открытый ключ для шифрования и передачи данных. Сервер получает зашифрованный текст от клиента, а затем использует его. собственный парный закрытый ключ. Расшифруйте его, чтобы получить исходные данные.
Общий процесс показан на рисунке ниже:

В Nodejs есть основной модуль — crypto , который предоставляет различные API, связанные с шифрованием и дешифрованием. Следующие примеры написаны на основе версии [email protected] .
const crypto = require('crypto');
/**
* Генерация пар открытого и закрытого ключей RSA * @return {*} publicKey: открытый ключ; PrivateKey: закрытый ключ */
функция genRSAKeyPaire() {
const { publicKey, PrivateKey } = crypto.generateKeyPairSync('rsa', {
длина модуля: 4096,
publicKeyEncoding: {
введите: 'pkcs1',
формат: 'ПЕМ',
},
PrivateKeyEncoding: {
введите: 'pkcs1',
формат: 'ПЕМ',
},
});
вернуть {publicKey, PrivateKey};
}
//Распечатываем сгенерированные пары открытого и закрытого ключей console.log(genRSAKeyPaire());Пример вывода выглядит следующим образом:
(Часть примеров открытого и закрытого ключей удалена, пожалуйста, не используйте их для экспериментов)
{
publicKey: '-----BEGIN RSA PUBLIC KEY-----n' +
'MIICCgKCAgEAsitohTu9Jf2h+NPV4tNfFhPrlbStzXNM8wSEcskwtpwi6aZfgQC7n' +
'/A7M1hN8Zk8WgiZjy05AHinWPvXo70OWj8TminIAjB2wh0nDqm+IQqN7r20uzeJmn' +
'GBf1KusGemChEiFwiad1h/OB9z9LC8zMYR/G+XAbFfcv8MxAMI9mgmS8t5+xeYm6n' +
'EMiCQkQjfqpErhW3oESj8hrdJdOZbiK3l0TgYLyjZRQu6pHzFkmd9We3BY1qcXo1n' +
'2BtNKvqoH9QDJItsb3S9v2moGl1rbitKlDrqYCdGY4iyXVIfagNWHraVzHqH/tern' +
'X+hOmLOwu+Npkz+oEDmnUq1UGY181PBGiNwHVodXx+DF5ckj/bGIxFG2nSiNe3dOn' +
'WLxV3+W8Af0006Oe+fRo1D7xt5SK5AipCpylKKYdyuP3MJ5dpPu7GMicwj20Ndnun' +
'cDJJ2HH9kZAKz6/r62S7ALLuFSecuZr0Dqc6SrJs43zBTpS/hSI33r01ste6Zel8n' +
'uRZKW/4FhUg8gW1KCM+Mp1MaZufOurCDc1Iec0SI71Tteg52BTpfb8cQ9Z1h0xWRn' +
'FdbmLMLuJkIi5oG2+FLAqlGknik0AxXpnlivSOW5Q+eLOh0DjQxxU2sCAwEAAQ==n' +
'-----КОНЕЦ ОТКРЫТОГО КЛЮЧА RSA -----n',
PrivateKey: '-----BEGIN RSA PRIVATE KEY-----n' +
'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' +
'-----КОНЕЦ ЧАСТНОГО КЛЮЧА RSA -----n'
}2. Шифрование с открытым ключом
На основе пары открытого и закрытого ключей для шифрования используется открытый ключ. Пример кода выглядит следующим образом:
const crypto = require('crypto');
/**
* Создайте пару открытого и закрытого ключей * @return {*} publicKey: открытый ключ; PrivateKey: закрытый ключ */
функция genRSAKeyPaire() {
const { publicKey, PrivateKey } = crypto.generateKeyPairSync('rsa', {
длина модуля: 4096,
publicKeyEncoding: {
введите: 'pkcs1',
формат: 'ПЕМ',
},
PrivateKeyEncoding: {
введите: 'pkcs1',
формат: 'ПЕМ',
},
});
вернуть {publicKey, PrivateKey};
}
const {publicKey} = genRSAKeyPaire ();
/**
* Использовать открытый ключ для шифрования * Данные @param {String}
* @param {String} publicKey
* @return {String} зашифрованный зашифрованный текст */
функция publicKeyEncrypt(данные, publicKey) {
return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64')
}
константная запись = {
имя: «Чжансан»,
пароль: '123456'
};
// Преобразуем данные в строковый формат, выполняем шифрование с открытым ключом и печатаем console.log(publicKeyEncrypt(JSON.stringify(entry), publicKey));Выходной контент имеет следующий формат:
(Данные удалены)
Ri0p8QFmnYe8Xo36DextK242o9pcdL0QFDo6gUxhzjwQD30UFlqJL57na445BebSp1VT1z94emJgrME7xTDzV1tshtmVNtarqCUCzZMF4uYAtZCQLJhCX3708g7lOFksiUvi6MlXCVVOIu 2VyFsIS /6DeEWYNirPK6zEBw1e2V2jWoL+63+iGNyhtKFJI1ECGyMmXUWCMicUmgE/JiHJD7YXPKB9+WaB7Wglj5udBdd4fALUp7qIo8TWJZJkLUg5yMbe7kemNWk050Xi1KiEt3s8IA qorB1qGghTmE/TW +M/jIblSSy3Urle1AYsOFUzh9wV/H+uD+UNdaCvlvfmdV8hTIjjLNy9r/GbuaI5N0TkaX/dk47iUuorZabPoINEnM8lYxcKPvgVJufMfSX5wLxgx60nt4cpz3T2IutO97sd ocVbhsiSlpFLpIk88 xd4=
3. Расшифровка секретного ключа
Когда зашифрованный текст зашифрован открытым ключом, используйте закрытый ключ для его расшифровки. Код выглядит следующим образом:
const crypto = require('crypto');
/**
* Создайте пару открытого и закрытого ключей * @return {*} publicKey: открытый ключ; PrivateKey: закрытый ключ */
функция genRSAKeyPaire() {
const { publicKey, PrivateKey } = crypto.generateKeyPairSync('rsa', {
длина модуля: 4096,
publicKeyEncoding: {
введите: 'pkcs1',
формат: 'ПЕМ',
},
PrivateKeyEncoding: {
введите: 'pkcs1',
формат: 'ПЕМ',
},
});
вернуть {publicKey, PrivateKey};
}
const {publicKey, PrivateKey} = genRSAKeyPaire();
/**
* Использовать открытый ключ для шифрования * Данные @param {String}
* @param {String} publicKey
* @return {String} зашифрованный зашифрованный текст */
функция publicKeyEncrypt(данные, publicKey) {
return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64')
}
константная запись = {
имя: «Чжансан»,
пароль: '123456'
};
const EncryptedData = publicKeyEncrypt(JSON.stringify(entry), publicKey);
/**
* Расшифровать с помощью закрытого ключа * @param {String} EncryptedData
* @param {String} PrivateKey
* @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 недостаточно (легко быть взломанным и атакованным посредником). Следовательно, данные должны быть зашифрованы на уровне приложения, чтобы предотвратить перехват данных и их использование другими. Использование асимметричного шифрования может гарантировать, что отправленный зашифрованный текст может быть расшифрован только сервером с помощью закрытого ключа, тем самым предотвращая шифрование зашифрованного текста. расшифрованы и использованы другими несвязанными сторонами. В сфере Интернета не существует абсолютной безопасности. Единственное долгосрочное решение — постоянно повышать свою осведомленность о безопасности и совершенствовать свои навыки в области безопасности.