Skip to content

Instantly share code, notes, and snippets.

@SatoshiMota
Created August 18, 2024 00:32
Show Gist options
  • Save SatoshiMota/621f63551c25ff962f7e0fd366b4f209 to your computer and use it in GitHub Desktop.
Save SatoshiMota/621f63551c25ff962f7e0fd366b4f209 to your computer and use it in GitHub Desktop.
Encrypt/Decrypt data via aes-256-gcm
// 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