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

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

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

Начать курс

Криптография в Node.js: шифрование и хеширование с помощью модуля crypto

Безопасность данных — один из ключевых аспектов современной веб-разработки. В Node.js встроенный модуль crypto предоставляет мощные инструменты для криптографической защиты: от хеширования паролей до асимметричного шифрования. В этой статье мы подробно разберём основные функции модуля crypto, научимся шифровать и расшифровывать данные, а также безопасно хранить пароли с помощью хеширования.

1. Подключение модуля crypto

Модуль crypto является встроенным, поэтому не требует установки дополнительных пакетов. Подключается он стандартным способом:

const crypto = require('crypto');

2. Хеширование данных

Хеширование — это процесс преобразования данных произвольной длины в строку фиксированной длины. В отличие от шифрования, хеш-функция необратима. Наиболее популярные алгоритмы: SHA-256, SHA-512.

Пример: хеширование строки с помощью SHA-256

const data = 'PythonLib — ваш путеводитель в мир IT';
const hash = crypto.createHash('sha256').update(data).digest('hex');
console.log('SHA-256 хеш:', hash);

Пример: хеширование с солью (bcrypt)

Для безопасного хранения паролей рекомендуется использовать алгоритм bcrypt или scrypt. В Node.js есть встроенная поддержка scrypt:

const password = 'mySuperPassword123';
const salt = crypto.randomBytes(16).toString('hex');

crypto.scrypt(password, salt, 64, (err, derivedKey) => {
  if (err) throw err;
  console.log('Хеш пароля:', derivedKey.toString('hex'));
});

3. Симметричное шифрование (AES)

Симметричное шифрование использует один и тот же ключ для шифрования и расшифровки данных. Наиболее распространённый алгоритм — AES (Advanced Encryption Standard).

Шифрование данных с AES-256-CBC

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32); // 256-битный ключ
const iv = crypto.randomBytes(16);  // вектор инициализации

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { iv: iv.toString('hex'), encryptedData: encrypted };
}

const originalText = 'Секретные данные для PythonLib';
const encrypted = encrypt(originalText);
console.log('Зашифрованные данные:', encrypted);

Расшифровка данных

function decrypt(encryptedObj) {
  const decipher = crypto.createDecipheriv(
    algorithm,
    key,
    Buffer.from(encryptedObj.iv, 'hex')
  );
  let decrypted = decipher.update(encryptedObj.encryptedData, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

const decryptedText = decrypt(encrypted);
console.log('Расшифрованный текст:', decryptedText);

4. Асимметричное шифрование (RSA)

Асимметричное шифрование использует пару ключей: открытый (public) и закрытый (private). Открытым ключом шифруют данные, а закрытым — расшифровывают. Это основа HTTPS и цифровых подписей.

Генерация пары ключей RSA

const { generateKeyPairSync } = require('crypto');

const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 2048,
  publicKeyEncoding: { type: 'spki', format: 'pem' },
  privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
});

console.log('Открытый ключ:\n', publicKey);
console.log('Закрытый ключ:\n', privateKey);

Шифрование и расшифровка с RSA

const secretMessage = 'Привет, PythonLib!';

// Шифрование открытым ключом
const encryptedData = crypto.publicEncrypt(
  { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
  Buffer.from(secretMessage)
);
console.log('Зашифрованное сообщение:', encryptedData.toString('base64'));

// Расшифровка закрытым ключом
const decryptedData = crypto.privateDecrypt(
  { key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
  encryptedData
);
console.log('Расшифрованное сообщение:', decryptedData.toString('utf8'));

5. Цифровые подписи и верификация

Цифровые подписи позволяют проверить подлинность и целостность данных. Подпись созда

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