AES-256-CBC относится к симметричным алгоритмам шифрования, где один и тот же секретный ключ используется для шифрования и расшифровки данных. AES (Advanced Encryption Standard) с длиной ключа 256 бит считается одним из наиболее стойких стандартов криптографии, а режим CBC (Cipher Block Chaining) добавляет дополнительный уровень защиты за счёт цепочки зависимостей между блоками данных.
AES работает с блоками фиксированного размера — 128 бит. Независимо от длины входных данных, они разбиваются на блоки, каждый из которых проходит серию криптографических преобразований: подстановки, перестановки и смешивания.
Режим CBC изменяет базовую модель работы AES следующим образом:
Это создаёт зависимость между блоками, что делает анализ повторяющихся паттернов в данных значительно сложнее.
C_i = E_{K}(P_i C_{i-1})
где:
Длина ключа 256 бит означает, что пространство возможных ключей крайне велико. Полный перебор практически невозможен при современных вычислительных ресурсах.
Ключевые требования:
В JavaScript (Node.js) это обычно реализуется через
crypto.randomBytes.
IV не является секретом, но критически важен для безопасности. Его свойства:
Повтор IV с тем же ключом приводит к утечке структурной информации о данных.
Шифрование выполняется поэтапно:
Padding чаще всего реализуется через PKCS#7, где недостающие байты заполняются значением количества добавленных байт.
В стандартной библиотеке Node.js используется модуль
crypto.
Шифрование:
const crypto = require('crypto');
function encryptAES256CBC(text, key) {
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(text, 'utf8', 'base64');
encrypted += cipher.final('base64');
return {
iv: iv.toString('base64'),
data: encrypted
};
}
Расшифровка:
function decryptAES256CBC(encryptedData, key, iv) {
const decipher = crypto.createDecipheriv(
'aes-256-cbc',
key,
Buffer.from(iv, 'base64')
);
let decrypted = decipher.update(encryptedData, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
Ключ должен быть ровно 32 байта (256 бит):
const key = crypto.randomBytes(32);
Использование строк напрямую недопустимо без функции деривации ключа (например, PBKDF2, scrypt или bcrypt), поскольку снижает стойкость шифрования.
Несмотря на широкое использование, CBC имеет ряд особенностей:
Именно отсутствие встроенной проверки целостности делает CBC уязвимым к модификациям ciphertext без обнаружения.
В некоторых криптографических обёртках поверх Node.js, включая схемы наподобие Iron, AES-256-CBC используется как базовый слой шифрования. Поверх него добавляется:
Такая комбинация превращает AES-CBC из базового шифра в защищённый механизм «упаковки данных», где конфиденциальность и целостность обеспечиваются совместно.
AES-256-CBC остаётся фундаментальным режимом шифрования, но в современных системах он часто применяется как часть более сложных схем, а не как самостоятельный механизм защиты данных.