Правильно ли я выполняю шифрование и дешифрование AES 256 Node.js? - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужно зашифровать сообщение чата, в котором будет храниться база данных. Данные представляют собой строку символов различной длины. Я хочу использовать собственную криптографическую библиотеку node.js и использовать симметричный протокол шифрования, такой как AES 256. У меня есть следующие опасения:

  1. Является ли CBC правильным режимом AES для этого варианта использования для этого типа поля, хранящегося в поле TEXT в MySQL?
  2. Ключ выглядит так, как будто он сгенерирован правильно?
  3. Является ли IV правильным? Является ли добавление IV к зашифрованному тексту правильным способом или это должно быть отдельное поле?
// AES RFC - https://tools.ietf.org/html/rfc3602
const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
// generate key with crypto.randomBytes(256/8).toString('hex')
const key = '6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1';
const IV_LENGTH = 16;

const encrypt = (text) => {
  const iv = crypto.randomBytes(IV_LENGTH);
  const cipher = crypto.createCipheriv(algorithm, Buffer.from(key, 'hex'), iv);
  let encrypted = cipher.update(text);
  encrypted = Buffer.concat([encrypted, cipher.final()]);
  return `${iv.toString('hex')}:${encrypted.toString('hex')}`;
};

const decrypt = (text) => {
  const [iv, encryptedText] = text.split(':').map(part => Buffer.from(part, 'hex'));
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key, 'hex'), iv);
  let decrypted = decipher.update(encryptedText);
  decrypted = Buffer.concat([decrypted, decipher.final()]);
  return decrypted.toString();
};

exports.encrypt = encrypt;
exports.decrypt = decrypt;

1 Ответ

0 голосов
/ 07 сентября 2018

Является ли CBC правильным режимом AES для этого варианта использования для этого типа поля, хранящегося в поле TEXT в MySQL?

Ну, это немного зависит от вашего текста. Но, вероятно, да.

Ключ выглядит так, как будто он сгенерирован правильно?

Да, выглядит хорошо для меня. Это должно выглядеть случайным, и это выглядит случайным. Не уверен, что тебя беспокоит.

Правильно ли IV? Является ли добавление IV к зашифрованному тексту правильным способом или это должно быть отдельное поле?

IV выглядит хорошо для меня. Я не вижу многих причин, почему вы не должны делать это таким образом, кроме одной: это не очень эффективно для хранения. Было бы гораздо эффективнее хранить данные не в виде шестнадцатеричной строки, а в виде двоичных данных! И тогда вы не можете просто использовать двоеточие для разделения данных. Так что либо вы знаете, что это первые n байтов, либо вы делаете отдельное поле. У обоих есть свои плюсы и минусы, но оба в порядке. Это вопрос стиля.

...