Криптография в Node.js: шифрование и хеширование с crypto

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в 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                    

Рекомендаций