Впровадження шифрування RSA в Node.js додаток

текст перекладу
Привітання
У сучасному цифровому світі безпека даних є надзвичайно важливою. Шифрування — один із найпопулярніших способів захистити чутливу інформацію. Відомий асиметричний алгоритм шифрування RSA (Rivest-Shamir-Adleman) вимагає два ключі: публічний для шифрування та приватний для дешифрування.

Розглянувши це крок за кроком, у цій статті ми розглянемо, як інтегрувати шифрування та дешифрування RSA в Node.js додаток. Крім того, ми обговоримо, як використовувати RSA для підписання та перевірки даних, гарантуючи, що вони є справжніми та незміненими.

Тож, почнемо!

pic

RSA Шифрування

Що таке RSA шифрування?

RSA — це асиметричний криптографічний алгоритм, що означає, що він використовує два ключі:

  • Публічний ключ: Використовується для шифрування та перевірки підписів. Його можна поширювати публічно.
  • Приватний ключ: Використовується для дешифрування та підписання. Він повинен залишатися в секреті.

Безпека RSA базується на математичних труднощах факторизації великих чисел. Він широко використовується в таких додатках, як захист комунікацій, підпис цифрових сертифікатів і шифрування даних.

Переваги використання RSA шифрування

  1. Асиметричне шифрування: RSA використовує два ключі (публічний та приватний), що гарантує, що процеси шифрування та дешифрування відокремлені, що підвищує безпеку.
  2. Цілісність даних: RSA допомагає перевірити, що дані не були змінені, використовуючи цифрові підписи для підтвердження їх справжності.
  3. Конфіденційність: Публічні ключі можна відкрито поширювати для шифрування повідомлень, тоді як тільки приватний ключ може їх дешифрувати, що забезпечує конфіденційність.
  4. Аутентифікація: Цифрові підписи RSA дозволяють відправнику довести свою особу, що дає можливість отримувачу довіряти джерелу повідомлення.
  5. Неотримання: Оскільки RSA використовує приватні ключі для підписування повідомлень, відправник не може пізніше заперечувати, що він відправив повідомлення, що дає юридичні та контрактні гарантії.
  6. Широко довіряється: RSA є одним з найбільш довірених і встановлених методів шифрування, що використовується в різних протоколах безпеки, таких як SSL/TLS.
  7. Масштабованість і гнучкість: RSA можна адаптувати для різних сценаріїв використання, таких як захист електронної пошти, цифрові підписи та передача даних.

Використовуючи RSA, ви забезпечуєте як конфіденційність, так і безпеку для чутливих комунікацій.

Кроки для реалізації RSA в Node.js

У цьому розділі ми пройдемо через простий Node.js додаток, що виконує шифрування, дешифрування, підписання та перевірку за допомогою RSA.

Крок 1: Налаштування проекту

Для початку створіть новий проект Node.js і встановіть необхідні залежності.

  1. Створіть нову директорію для вашого проекту:
mkdir rsa-node-app  
cd rsa-node-app
  1. Ініціалізуйте новий проект Node.js:
npm init -y
  1. Встановіть Express.js (для створення API сервера) та crypto (для операцій RSA):
npm install express

4.
текст перекладу
Створіть файл rsaUtils.js, де будуть реалізовані всі операції RSA.

Крок 2: Створення модуля утиліт RSA

У файлі rsaUtils.js ми визначимо функції для генерації RSA ключів, шифрування/дешифрування даних, підписування даних та перевірки підпису.

rsaUtils.js

const crypto = require('crypto');  

const RSAUtils = {  
 // Генерація пари RSA ключів  
 generateKeyPair: () =>  
 new Promise((resolve, reject) => {  
 crypto.generateKeyPair(  
 'rsa',  
 {  
 modulusLength: 2048, // Довжина ключа  
 publicKeyEncoding: { type: 'spki', format: 'pem' }, // Кодування публічного ключа  
 privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, // Кодування приватного ключа  
 },  
 (err, publicKey, privateKey) => {  
 if (err) reject(err);  
 resolve({ publicKey, privateKey });  
 }  
 );  
 }),  

 // Шифрування даних за допомогою публічного ключа  
 encrypt: (publicKey, plaintext) =>  
 crypto.publicEncrypt(publicKey, Buffer.from(plaintext)),  

 // Дешифрування даних за допомогою приватного ключа  
 decrypt: (privateKey, encrypted) =>  
 crypto.privateDecrypt(privateKey, encrypted),  

 // Підписування даних за допомогою приватного ключа  
 sign: (privateKey, message) => {  
 const signer = crypto.createSign('sha256');  
 signer.update(message);  
 signer.end();  
 return signer.sign(privateKey, 'base64');  
 },  

 // Перевірка підпису за допомогою публічного ключа  
 verify: (publicKey, message, signature) => {  
 const verifier = crypto.createVerify('sha256');  
 verifier.update(message);  
 verifier.end();  
 return verifier.verify(publicKey, signature, 'base64');  
 },  
};  

module.exports = RSAUtils;

Пояснення:

  • generateKeyPair(): Генерує пару публічного/приватного RSA ключа за допомогою методу crypto.generateKeyPair().
  • encrypt(): Шифрує дані за допомогою публічного ключа.
  • decrypt(): Дешифрує зашифровані дані за допомогою приватного ключа.
  • sign(): Підписує дані за допомогою приватного ключа для забезпечення їх цілісності та автентичності.
  • verify(): Перевіряє підпис за допомогою публічного ключа, щоб підтвердити автентичність даних.

Крок 3: Створення сервера Express

Тепер давайте створимо сервер Express, щоб виставити ці RSA операції через RESTful кінцеві точки.

app.js

const express = require('express');  
const RSAUtils = require('./rsaUtils');  

const app = express();  
app.use(express.json());  

// Глобальне зберігання ключів (для демонстраційних цілей)  
let keys = {};  

// Кінцева точка: Генерація ключів  
app.post('/generate-keys', async (req, res) => {  
 try {  
 keys = await RSAUtils.generateKeyPair();  
 res.json({ message: 'Ключі успішно згенеровані', keys });  
 } catch (err) {  
 res.status(500).json({ error: 'Помилка при генерації ключів', details: err.message });  
 }  
});  

// Кінцева точка: Шифрування даних  
app.post('/encrypt', (req, res) => {  
 try {  
 const { plaintext } = req.body;  
 const encrypted = RSAUtils.encrypt(keys.publicKey, plaintext);  
 res.json({ encrypted: encrypted.toString('base64') });  
 } catch (err) {  
 res.status(500).json({ error: 'Помилка при шифруванні даних', details: err.message });  
 }  
});  

// Кінцева точка: Дешифрування даних  
app.post('/decrypt', (req, res) => {  
 try {  
 const { encrypted } = req.body;  
 const decrypted = RSAUtils.decrypt(keys.privateKey, Buffer.from(encrypted, 'base64'));  
 res.json({ decrypted: decrypted.toString() });  
 } catch (err) {  
 res.status(500).json({ error: 'Помилка при дешифруванні даних', details: err.message });  
 }  
});  

// Кінцева точка: Підписання даних  
app.post('/sign', (req, res) => {  
 try {  
 const { message } = req.body;  
 const signature = RSAUtils.sign(keys.privateKey, message);  
 res.json({ signature });  
 } catch (err) {  
 res.status(500).json({ error: 'Помилка при підписанні даних', details: err.message });  
 }  
});  

// Кінцева точка: Перевірка підпису  
app.post('/verify', (req, res) => {  
 try {  
 const { message, signature } = req.body;  
 const isVerified = RSAUtils.verify(keys.publicKey, message, signature);  
 res.json({ verified: isVerified });  
 } catch (err) {
текст перекладу
res.status(500).json({ error: 'Помилка при перевірці підпису', details: err.message });  
 }  
});  

// Запуск сервера  
const PORT = 3000;  
app.listen(PORT, () => {  
 console.log(`Сервер працює на http://localhost:${PORT}`);  
});

Пояснення:

  • Сервер надає п’ять основних кінцевих точок:
  • /generate-keys: Генерує пару публічного/приватного RSA ключів.
  • /encrypt: Шифрує заданий відкритий текст за допомогою публічного ключа.
  • /decrypt: Дешифрує зашифроване повідомлення за допомогою приватного ключа.
  • /sign: Підписує задане повідомлення за допомогою приватного ключа.
  • /verify: Перевіряє автентичність повідомлення за допомогою публічного ключа та його підпису.

Крок 4: Тестування додатку

Щоб протестувати додаток:

1.
текст перекладу
Запуск сервера:

node app.js

2. Використовуйте Postman або cURL для взаємодії з API.

  • Генерація ключів:
    Надішліть POST-запит на /generate-keys.
  • Шифрування даних:
    Надішліть POST-запит на /encrypt з відкритим текстом у тілі запиту.
  • Дешифрування даних:
    Надішліть POST-запит на /decrypt з зашифрованим повідомленням у тілі запиту.
  • Підпис даних:
    Надішліть POST-запит на /sign з повідомленням, яке потрібно підписати.
  • Перевірка підпису:
    Надішліть POST-запит на /verify з повідомленням і підписом.

Міркування з безпеки

  1. Безпечне зберігання ключів: Ніколи не жорстко закодовувати ключі у вашому додатку. Для виробничих середовищ зберігайте ключі безпечно, наприклад, у змінних середовища або в безпечних сервісах керування ключами.
  2. Використовуйте HTTPS: Завжди використовуйте HTTPS для захисту даних, що передаються між клієнтом і сервером, забезпечуючи безпеку самого процесу шифрування.
  3. Валідація та обробка помилок: Правильно перевіряйте введення користувача та обробляйте помилки коректно, щоб уникнути потенційних вразливостей.
  4. Ротація ключів: Періодично змінюйте ваші ключі та анулюйте старі, щоб підвищити рівень безпеки.

Перекладено з: Implementing RSA Encryption in a Node.js Application

Leave a Reply

Your email address will not be published. Required fields are marked *