Как сделать кодирование Base64 в node.js? - PullRequest
740 голосов
/ 31 мая 2011

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

Причина, по которой я спрашиваю это, заключается в том, что final() из 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');

Тогда что я должен использовать для расшифровки?Шестнадцатеричный или base64?

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

Спасибо.

Ответы [ 4 ]

1758 голосов
/ 31 мая 2011

Буферы могут использоваться для получения строки или фрагмента данных и выполнения кодирования 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' - многобайтовое кодирование Юникод персонажи. Многие веб-страницы и другие форматы документов используют UTF-8.

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

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

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

193 голосов
/ 07 июля 2016

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

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

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

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

console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));
39 голосов
/ 24 апреля 2015

crypto теперь поддерживает base64 ( reference ):

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');
0 голосов
/ 13 июля 2019

Я использую следующий код для декодирования строки 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.

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