Как сделать кодировку Base64 в node.js?

Есть ли еще node.js встроенная кодировка base64?

Причина, по которой я спрашиваю об этом, заключается в том, что final() from crypto может выводить только шестнадцатеричные, двоичные или ascii-данные. Например:

var cipher = crypto.createCipheriv('des-ede3-cbc', encryption_key, iv);
var ciph = cipher.update(plaintext, 'utf8', 'hex');
ciph += cipher.final('hex');

var decipher = crypto.createDecipheriv('des-ede3-cbc', encryption_key, iv);
var txt = decipher.update(ciph, 'hex', 'utf8');
txt += decipher.final('utf8');

В соответствии с документами update() может выводить данные с кодировкой base64. Однако final() не поддерживает base64. Я попытался, и он сломается.

Если я это сделаю:

var ciph = cipher.update(plaintext, 'utf8', 'base64');
    ciph += cipher.final('hex');

Тогда что я должен использовать для дешифрования? Hex или base64?

Поэтому я ищу функцию для base64-кодирования моего зашифрованного шестнадцатеричного вывода.

Спасибо.

Ответ 1

Буферы могут быть использованы для получения строки или фрагмента данных и выполнения base64-кодирования результата. Например:

> console.log(Buffer.from("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
> console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'))
Hello World

Буферы являются глобальным объектом, поэтому в них нет необходимости. Буферы, созданные со строками, могут принимать необязательный параметр кодирования, чтобы указать, в какой кодировке находится строка. Доступны следующие кодировки конструктора toString и Buffer:

'ascii' - только для 7-битных данных ASCII. Этот метод кодирования очень быстрый, и он удаляет старший бит, если установлен.

'utf8' - многобайтовые символы Unicode. Многие веб-страницы и другие форматы документов используют UTF-8.

'ucs2' - 2-байтовые символы Unicode, закодированные с прямым порядком байтов. Он может кодировать только BMP (базовая многоязычная плоскость, U + 0000 - U + FFFF).

'base64' - строковое кодирование Base64.

"двоичный" - способ кодирования необработанных двоичных данных в строки с использованием только первых 8 бит каждого символа. Этот метод кодирования устарел и его следует избегать в пользу объектов Buffer, где это возможно. Эта кодировка будет удалена в будущих версиях Node.

Ответ 2

В принятом ответе содержится то, что считается проблемой безопасности в версиях node, превышающих 6 (хотя для этой usecase кажется вероятным, что вход всегда можно принуждать к строке).

Конструктор Buffer устарел в соответствии с документацией .

Здесь является примером уязвимости, которая может возникнуть в результате использования ее в ws-библиотеке.

Фрагменты кода должны читать:

console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));

Ответ 3

crypto теперь поддерживает base64 (ссылка):

cipher.final('base64') 

Итак, вы можете просто сделать:

var cipher = crypto.createCipheriv('des-ede3-cbc', encryption_key, iv);
var ciph = cipher.update(plaintext, 'utf8', 'base64');
ciph += cipher.final('base64');

var decipher = crypto.createDecipheriv('des-ede3-cbc', encryption_key, iv);
var txt = decipher.update(ciph, 'base64', 'utf8');
txt += decipher.final('utf8');

Ответ 4

Я использую следующий код для декодирования строки base64 в API узла nodejs версии 10.7.0

let data = 'c3RhY2thYnVzZS5jb20=';  // Base64 string
let buff = new Buffer(data, 'base64');  //Buffer
let text = buff.toString('ascii');  //this is the data type that you want your Base64 data to convert to
console.log('"' + data + '" converted from Base64 to ASCII is "' + text + '"'); 

Пожалуйста, не пытайтесь запустить приведенный выше код в консоли браузера, это не сработает. Поместите код в серверные файлы nodejs. Я использую приведенный выше строчный код в разработке API.