Криптография в 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. Цифровые подписи и верификация
Цифровые подписи позволяют проверить подлинность и целостность данных. Подпись созда
Также в библиотеке
Работа с Kafka в PHP: библиотеки, подключение и примеры кода
Машинное обучение на PHP: обзор библиотек для интеграции ML
Работа с CSV в Java: полное руководство по чтению и записи
Валидация данных в PHP с библиотекой Respect\Validation