текст перекладу
Привітання
У сучасному цифровому світі безпека даних є надзвичайно важливою. Шифрування — один із найпопулярніших способів захистити чутливу інформацію. Відомий асиметричний алгоритм шифрування RSA (Rivest-Shamir-Adleman) вимагає два ключі: публічний для шифрування та приватний для дешифрування.
Розглянувши це крок за кроком, у цій статті ми розглянемо, як інтегрувати шифрування та дешифрування RSA в Node.js додаток. Крім того, ми обговоримо, як використовувати RSA для підписання та перевірки даних, гарантуючи, що вони є справжніми та незміненими.
Тож, почнемо!
RSA Шифрування
Що таке RSA шифрування?
RSA — це асиметричний криптографічний алгоритм, що означає, що він використовує два ключі:
- Публічний ключ: Використовується для шифрування та перевірки підписів. Його можна поширювати публічно.
- Приватний ключ: Використовується для дешифрування та підписання. Він повинен залишатися в секреті.
Безпека RSA базується на математичних труднощах факторизації великих чисел. Він широко використовується в таких додатках, як захист комунікацій, підпис цифрових сертифікатів і шифрування даних.
Переваги використання RSA шифрування
- Асиметричне шифрування: RSA використовує два ключі (публічний та приватний), що гарантує, що процеси шифрування та дешифрування відокремлені, що підвищує безпеку.
- Цілісність даних: RSA допомагає перевірити, що дані не були змінені, використовуючи цифрові підписи для підтвердження їх справжності.
- Конфіденційність: Публічні ключі можна відкрито поширювати для шифрування повідомлень, тоді як тільки приватний ключ може їх дешифрувати, що забезпечує конфіденційність.
- Аутентифікація: Цифрові підписи RSA дозволяють відправнику довести свою особу, що дає можливість отримувачу довіряти джерелу повідомлення.
- Неотримання: Оскільки RSA використовує приватні ключі для підписування повідомлень, відправник не може пізніше заперечувати, що він відправив повідомлення, що дає юридичні та контрактні гарантії.
- Широко довіряється: RSA є одним з найбільш довірених і встановлених методів шифрування, що використовується в різних протоколах безпеки, таких як SSL/TLS.
- Масштабованість і гнучкість: RSA можна адаптувати для різних сценаріїв використання, таких як захист електронної пошти, цифрові підписи та передача даних.
Використовуючи RSA, ви забезпечуєте як конфіденційність, так і безпеку для чутливих комунікацій.
Кроки для реалізації RSA в Node.js
У цьому розділі ми пройдемо через простий Node.js додаток, що виконує шифрування, дешифрування, підписання та перевірку за допомогою RSA.
Крок 1: Налаштування проекту
Для початку створіть новий проект Node.js і встановіть необхідні залежності.
- Створіть нову директорію для вашого проекту:
mkdir rsa-node-app
cd rsa-node-app
- Ініціалізуйте новий проект Node.js:
npm init -y
- Встановіть 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
з повідомленням і підписом.
Міркування з безпеки
- Безпечне зберігання ключів: Ніколи не жорстко закодовувати ключі у вашому додатку. Для виробничих середовищ зберігайте ключі безпечно, наприклад, у змінних середовища або в безпечних сервісах керування ключами.
- Використовуйте HTTPS: Завжди використовуйте HTTPS для захисту даних, що передаються між клієнтом і сервером, забезпечуючи безпеку самого процесу шифрування.
- Валідація та обробка помилок: Правильно перевіряйте введення користувача та обробляйте помилки коректно, щоб уникнути потенційних вразливостей.
- Ротація ключів: Періодично змінюйте ваші ключі та анулюйте старі, щоб підвищити рівень безпеки.
Перекладено з: Implementing RSA Encryption in a Node.js Application