Created
August 18, 2024 00:32
-
-
Save SatoshiMota/621f63551c25ff962f7e0fd366b4f209 to your computer and use it in GitHub Desktop.
Encrypt/Decrypt data via aes-256-gcm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// node 0-SECURE_encrypt_decrypt_data.js | |
const crypto = require('crypto'); | |
//Шифрование | |
function encrypt(data, password) { | |
// Генерация salt для уникальности шифрованого пароля | |
const salt = crypto.randomBytes(16); | |
// Создание ключа из пароля (длиной 32 байта) | |
const key = crypto.pbkdf2Sync(password, salt, 1000000, 32, 'sha512'); | |
// Генерация iv для уникальности шифрованых данных | |
const iv = crypto.randomBytes(12); | |
// Создание объекта с алгоритмом AES-256-GCM | |
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv); | |
// Шифрования данных алгоритмом AES-256-GCM | |
const encryptedData = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]); | |
// Получение тега авторизации | |
const tag = cipher.getAuthTag(); | |
console.log('Ключ получается из пароля + salt с помощью crypto.pbkdf2Sync'); | |
console.log('Количество итераций: 1000000,', 'Длина ключа в байтах: 32,', 'Метод создания ключа: sha512'); | |
console.log('Зашифрование данные получаются из ключа + iv с помощью aes-256-gcm (tag для проверки)'); | |
console.log(JSON.stringify({ | |
iv: iv.toString('hex'), | |
salt: salt.toString('hex'), | |
tag: tag.toString('hex'), | |
encryptedData: encryptedData.toString('hex') | |
}, null, 2)); | |
} | |
//Расшифрование | |
function decrypt(data, password) { | |
// Извлечение iv, salt, tag, encryptedData в buffer формате | |
const iv = Buffer.from(data.iv, 'hex'); | |
const salt = Buffer.from(data.salt, 'hex'); | |
const tag = Buffer.from(data.tag, 'hex'); | |
const encryptedData = Buffer.from(data.encryptedData, 'hex'); | |
// Создание ключа из пароля (длиной 32 байта) | |
const key = crypto.pbkdf2Sync(password, salt, 1000000, 32, 'sha512'); | |
// Создание объекта с алгоритмом AES-256-GCM (установка тега для проверки) | |
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv); | |
decipher.setAuthTag(tag); | |
// Расшифрование данных алгоритмом AES-256-GCM | |
const decrypted = Buffer.concat([decipher.update(encryptedData), decipher.final()]); | |
console.log('Расшифрованые данные:', decrypted.toString('utf8')); | |
} | |
// НЕ ЗАБЫВАТЬ ОЧИЩАТЬ ТЕРМИНАЛ (КОНСОЛЬ) ПОСЛЕ РАБОТЫ | |
const password = ''; | |
const encrypt_data = ``; | |
const decrypt_data = {}; | |
// encrypt(encrypt_data, password); | |
// decrypt(decrypt_data, password); | |
// const test_encrypt_data = `test | |
// test | |
// test | |
// test | |
// test | |
// test`; | |
// const test_decrypt_data = { | |
// "iv": "", | |
// "salt": "", | |
// "tag": "", | |
// "encryptedData": "" | |
// }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment