Як використовувати модуль Crypto в Node.js для хешування та шифрування?
Модуль Crypto
Вбудований модуль crypto надає криптографічні функції для хешування, шифрування, дешифрування та генерації випадкових значень. Він є важливим для операцій, чутливих до безпеки.
Хешування (Одностороннє)
Хешування перетворює дані в рядок фіксованого розміру. Це незворотне — ви не можете повернути оригінальні дані назад.
js
const crypto = require('crypto');
// Простий хеш
const hash = crypto.createHash('sha256')
.update('Hello World')
.digest('hex');
console.log(hash);
// a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146eЗагальні алгоритми хешування
| Алгоритм | Розмір виходу | Сфера використання |
|---|---|---|
md5 | 128-біт | Контрольні суми (НЕ для паролів) |
sha256 | 256-біт | Цілісність даних, підписи |
sha512 | 512-біт | Вищі вимоги до безпеки |
Хешування паролів з сіллю
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() | Чутливі дані в спокої |
| HMAC | createHmac() | Підписи API, вебхуки |
| Випадкові байти | randomBytes() | Токени, солі, ключі |
| UUID | randomUUID() | Унікальні ідентифікатори |
Важливо: Ніколи не використовуйте
md5абоsha1для паролів. Використовуйтеpbkdf2,scryptабоbcryptз належною сіллю та кількістю ітерацій. Завжди використовуйтеtimingSafeEqual()для порівняння хешів, щоб запобігти атакам за часом.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.