如何在node.js中进行Base64编码?


839

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');

那我应该用什么解密呢?十六进制还是base64?

因此,我正在寻找一个函数来对加密的十六进制输出进行base64编码。


8
对于在2016年/之后cipher.final('base64')工作的人来说,寻找这个问题的方法
avck

Answers:


1963

缓冲区可用于获取字符串或数据片段,并对结果进行base64编码。例如:

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

缓冲区是全局对象,因此不需要。用字符串创建的缓冲区可以使用可选的encoding参数来指定字符串的编码形式。可用toStringBuffer构造函数编码如下:

'ascii'-仅适用于7位ASCII数据。这种编码方法非常快,如果设置了高位,它将去除高位。

'utf8'-多字节编码的Unicode字符。许多网页和其他文档格式都使用UTF-8。

'ucs2'-2字节,小端编码的Unicode字符。它只能编码BMP(基本多语言平面,U + 0000-U + FFFF)。

'base64'-Base64字符串编码。

'binary'-一种仅使用每个字符的前8位将原始二进制数据编码为字符串的方法。不建议使用此编码方法,应尽可能避免使用Buffer对象。在将来的Node版本中将删除此编码。


2
const atob = (data) => Buffer.from(data, 'base64').toString('ascii');
spencer.sm '18 -10-5

应该是.toString("binary")atob毕竟代表ascii(base64)到二进制)
12Me21

@ 12Me21我认为它代表将ascii转换为base64?
David Callanan

@DavidCallanan ATOB()从BASE64转换
12Me21

@ 12Me21好,谢谢您的澄清
David Callanan

221

先前包含 的已接受答案new Buffer(),在大于6的节点版本中被认为是安全问题(尽管在此用例中,输入总是可以强制为字符串)。

Buffer构造是根据过时文件

这是在ws库中使用此漏洞可能导致的漏洞示例

代码段应显示为:

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

编写此答案后,它已经更新,现在与此匹配。


当我尝试使用第一行时,Node返回:[TypeError:这不是类型化数组。]
Dave Voyles

7
在v6之前的节点版本上会发生此错误。在这些版本中,您将需要使用构造函数(new Buffer)而不是Buffer.from
NotJavanese

在v4.5.0中添加了Buffer.from ()
dskrvk

71
只是为了节省您几分钟的时间,让我在尝试查看本示例与接受的答案之间的区别时迷失了方向,现在将接受的答案更新为该答案所建议的内容。
Kunok

39

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');

3
是否有理由在NotJavanese的答案上使用此功能?
Trevor

3
必须匹配Node和Python之间的加密,这个答案为我省了一个问题!谢谢:)
GigiSan '18

1

缓冲区可用于获取字符串或数据片段,并对结果进行base64编码。例如:

您可以通过npm 安装Buffer,例如:npm i buffer --save

您可以js像这样在文件中使用它:

var buffer = require('buffer/').Buffer;

->> console.log(buffer.from("Hello Vishal Thakur").toString('base64'));
SGVsbG8gVmlzaGFsIFRoYWt1cg==  // Result

->> console.log(buffer.from("SGVsbG8gVmlzaGFsIFRoYWt1cg==", 'base64').toString('ascii'))
Hello Vishal Thakur   // Result

0

我正在使用以下代码来解码节点API nodejs版本10.7.0中的base64字符串

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开发中使用上述代码。


0

我为Node.js中的base64编码/解码转换创建了一个最终的小型js npm库。

安装

npm install nodejs-base64-converter --save

用法

var nodeBase64 = require('nodejs-base64-converter');

console.log(nodeBase64.encode("test text")); //dGVzdCB0ZXh0
console.log(nodeBase64.decode("dGVzdCB0ZXh0")); //test text
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.