Как сделать кодировку 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.