Skip to main content
Практика завдань

Як використовувати модуль Crypto в Node.js для хешування та шифрування?

Модуль Crypto

Вбудований модуль crypto надає криптографічні функції для хешування, шифрування, дешифрування та генерації випадкових значень. Він є важливим для операцій, чутливих до безпеки.


Хешування (Одностороннє)

Хешування перетворює дані в рядок фіксованого розміру. Це незворотне — ви не можете повернути оригінальні дані назад.

js
const crypto = require('crypto'); // Простий хеш const hash = crypto.createHash('sha256') .update('Hello World') .digest('hex'); console.log(hash); // a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

Загальні алгоритми хешування

АлгоритмРозмір виходуСфера використання
md5128-бітКонтрольні суми (НЕ для паролів)
sha256256-бітЦілісність даних, підписи
sha512512-бітВищі вимоги до безпеки

Хешування паролів з сіллю

js
function hashPassword(password) { const salt = crypto.randomBytes(16).toString('hex'); const hash = crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha512').toString('hex'); return { salt, hash }; } function verifyPassword(password, salt, hash) { const verify = crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha512').toString('hex'); return verify === hash; } const { salt, hash } = hashPassword('myPassword123'); console.log(verifyPassword('myPassword123', salt, hash)); // true console.log(verifyPassword('wrongPassword', salt, hash)); // false

Симетричне шифрування (AES)

Один і той же ключ для шифрування та дешифрування:

js
const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); 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'), encrypted }; } function decrypt(encrypted, ivHex) { const decipher = crypto.createDecipheriv( algorithm, key, Buffer.from(ivHex, 'hex') ); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } const { iv: ivHex, encrypted } = encrypt('Secret message'); console.log('Зашифровано:', encrypted); console.log('Розшифровано:', decrypt(encrypted, ivHex));

HMAC (Код автентифікації повідомлень на основі хешу)

Перевіряє як цілісність даних, так і їх автентичність:

js
const secret = 'my-secret-key'; const hmac = crypto.createHmac('sha256', secret) .update('data to verify') .digest('hex'); // Перевірка function verifyHmac(data, receivedHmac, secret) { const expected = crypto.createHmac('sha256', secret) .update(data) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(receivedHmac), Buffer.from(expected) ); }

Генерація випадкових значень

js
// Випадкові байти (для токенів, ключів, солей) const token = crypto.randomBytes(32).toString('hex'); // Випадковий UUID const uuid = crypto.randomUUID(); // Випадкове ціле число в діапазоні const randomInt = crypto.randomInt(1, 100);

Швидка довідка

ОпераціяМетодСфера використання
ХешcreateHash()Контрольні суми, відбитки даних
Хеш пароляpbkdf2 / scryptЗберігання паролів
Шифрування/ДешифруванняcreateCipheriv()Чутливі дані в спокої
HMACcreateHmac()Підписи API, вебхуки
Випадкові байтиrandomBytes()Токени, солі, ключі
UUIDrandomUUID()Унікальні ідентифікатори

Важливо: Ніколи не використовуйте md5 або sha1 для паролів. Використовуйте pbkdf2, scrypt або bcrypt з належною сіллю та кількістю ітерацій. Завжди використовуйте timingSafeEqual() для порівняння хешів, щоб запобігти атакам за часом.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань