Криптография в Node.js: встроенный модуль crypto
В современной веб-разработке безопасность данных — критически важный аспект. Node.js предоставляет мощный и гибкий встроенный модуль crypto, который реализует широкий спектр криптографических функций. Этот модуль не требует установки дополнительных пакетов и позволяет решать задачи хеширования, симметричного и асимметричного шифрования, создания цифровых подписей и HMAC (Hash-based Message Authentication Code).
В данной статье мы подробно разберём основные возможности crypto и приведём практические примеры кода.
Основные возможности модуля crypto
- Хеширование — преобразование данных произвольной длины в строку фиксированной длины (SHA-256, SHA-512, MD5).
- Симметричное шифрование — шифрование и дешифрование с одним секретным ключом (AES-256-CBC, AES-192-GCM).
- Асимметричное шифрование — шифрование с парой ключей (публичный/приватный) на основе RSA или ECDH.
- HMAC — хеширование с секретным ключом для проверки целостности и подлинности сообщения.
- Цифровые подписи — создание и верификация подписей для подтверждения авторства.
Подключение модуля
Модуль crypto встроен в Node.js, поэтому его импорт осуществляется стандартным способом:
const crypto = require('crypto');
Пример 1: Хеширование данных (SHA-256)
Хеширование — односторонняя функция, которая часто используется для хранения паролей и проверки целостности файлов.
const data = 'PythonLib — образовательный портал';
// Создаём хеш SHA-256
const hash = crypto.createHash('sha256');
hash.update(data);
const hexHash = hash.digest('hex');
console.log('Исходные данные:', data);
console.log('SHA-256 хеш:', hexHash);
// Вывод: SHA-256 хеш: b5a1... (64 символа)
Важно: Для хранения паролей используйте не простой хеш, а функцию с «солью» — например, crypto.scryptSync() или pbkdf2Sync().
Пример 2: Хеширование пароля с солью (scrypt)
const password = 'MySecurePassword123';
// Генерация случайной соли
const salt = crypto.randomBytes(16).toString('hex');
// Создание хеша с солью (scrypt)
const hash = crypto.scryptSync(password, salt, 64).toString('hex');
console.log('Соль:', salt);
console.log('Хеш пароля:', hash);
// Для проверки используем ту же соль и сравниваем хеши
const isMatch = crypto.scryptSync(password, salt, 64).toString('hex') === hash;
console.log('Пароль совпадает:', isMatch); // true
Пример 3: Симметричное шифрование AES-256-CBC
Симметричное шифрование использует один ключ для шифрования и дешифрования. Алгоритм AES-256-CBC требует также вектор инициализации (IV).
// Функция шифрования
function encrypt(text, key) {
const iv = crypto.randomBytes(16); // Генерация IV
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return { iv: iv.toString('hex'), encrypted };
}
// Функция дешифрования
function decrypt(encrypted, key, ivHex) {
const iv = Buffer.from(ivHex, 'hex');
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// Использование
const key = crypto.randomBytes(32); // 256-битный ключ
const secretMessage = 'Секретные данные для PythonLib';
const encryptedData = encrypt(secretMessage, key);
console.log('Зашифровано:', encryptedData.encrypted);
console.log('IV:', encryptedData.iv);
const decryptedMessage = decrypt(encryptedData.encrypted, key, encryptedData.iv);
console.log('Расшифровано:', decryptedMessage);
Пример 4: Асимметричное шифрование RSA
RSA использует пару ключей: публичный для шифрования и приватный для дешифрования. Это основа безопасной передачи данных.
const { generateKeyPairSync, publicEncrypt, privateDecrypt } = crypto;
// Генерация пары ключей RSA-2048
const { publicKey, privateKey } = generateKey Также в библиотеке
Отправка SMS на Java: Обзор и примеры использования API библиотек (Twilio, Nexmo)
Мониторинг приложений Kotlin: библиотеки и инструменты для отслеживания производительности
JSON обработка в Node.js: полное руководство