В чем разница между использованием строки и буфера в шифровании Node.js. - PullRequest
2 голосов
/ 03 июля 2019

Я видел оба кода ниже на некоторых сайтах. Один использовал Buffer, чтобы обернуть crypto.randomBytes() объект для ключа шифрования, и использовал его для конкатенации окончательного результата шифрования, другой использовал простой crypto.randomBytes() объект для ключа шифрования и просто конкатенировал конечный результат, используя оператор «плюс равно».

const cipher = crypto.createCipheriv(
  "aes-256-gcm",
  Buffer.from(crypto.randomBytes(32)),
  crypto.randomBytes(16)
);
let encrypted = cipher.update("this is data");

encrypted = Buffer.concat([encrypted, cipher.final()]);
// edited: I forgot below line
encrypted = encrypted.toString("hex");

и ...

const cipher = crypto.createCipheriv(
  "aes-256-gcm",
  crypto.randomBytes(32),
  crypto.randomBytes(16)
);
let encrypted = cipher.update("this is data");

encrypted += cipher.final();

Обе реализации работают. Но я не могу найти объяснения, почему они используют Buffer и не знаю, в чем разница между этими двумя примерами.

UPDATE

Я пытался использовать одинаковые key и iv с обеими реализациями (как предложил Мартен Бодьюс , они дают одинаковый результат:

const crypto = require('crypto');

const data = 'hello world'
const algorithm = 'aes-256-gcm'
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt1(data) {
    const cipher = crypto.createCipheriv(algorithm, key, iv);
    let encrypted = cipher.update(data, 'utf8', 'hex');

    encrypted += cipher.final('hex');

    return encrypted;
}

function encrypt2(data) {
    const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
    let encrypted = cipher.update(data);

    encrypted = Buffer.concat([encrypted, cipher.final()]);

    return encrypted.toString('hex');
}

const result1 = encrypt1(data);
const result2 = encrypt2(data);

console.log('result1: ', result1); // -> result1:  501db5c82e79e3185c1601
console.log('result2: ', result2); // -> result2:  501db5c82e79e3185c1601

Итак, почему нужно использовать буфер, который выглядит более сложным для получения того же результата?

1 Ответ

0 голосов
/ 03 июля 2019

Buffer - это просто используемая внутренняя структура.

Вот некоторые возможные преимущества:

  • буфер может хранить байты в машинных словах (32 или 64).бит), чтобы сделать последующие операции эффективными;
  • нет необходимости преобразовывать туда и обратно между буфером и другими представлениями;
  • это также может быть более эффективным, чем хранение символов в строках -может быть неясно, каким именно образом они хранятся, даже если они просто представляют байты (они могут использовать 16- или 32-битные слова, например, удваивая или увеличивая в четыре раза требуемый размер);
  • , еслисуществует ошибка преобразования, она также может быть обнаружена в явной функции преобразования, а не в методе шифрования, что может упростить отладку;
  • это может упростить изменение кода, например, для использования другого кодированного кодаключ, например, в шестнадцатеричных.

И, наконец, Buffer ближе к тому, что на самом деле предполагается ключбыть октетной строкой или байтовым массивом , а не текстовой строкой .

Однако все, что сказано, для простых криптографических операцийнет различий, когда дело доходит до ожидаемого результата.Таким образом, в этом смысле оба метода действительны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...