Node.js有内置的Base64编码了吗?

我问这个问题的原因是crypto的final()只能输出十六进制、二进制或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编码我的加密十六进制输出。


当前回答

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

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

Buffers是一个全局对象,因此不需要require。用字符串创建的缓冲区可以接受一个可选的编码参数来指定字符串的编码方式。可用的toString和Buffer构造函数编码如下:

'ascii' - for 7 bit ASCII data only. This encoding method is very fast, and will strip the high bit if set. 'utf8' - Multi byte encoded Unicode characters. Many web pages and other document formats use UTF-8. 'ucs2' - 2-bytes, little endian encoded Unicode characters. It can encode only BMP(Basic Multilingual Plane, U+0000 - U+FFFF). 'base64' - Base64 string encoding. 'binary' - A way of encoding raw binary data into strings by using only the first 8 bits of each character. This encoding method is deprecated and should be avoided in favor of Buffer objects where possible. This encoding will be removed in future versions of Node.

其他回答

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

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

Buffers是一个全局对象,因此不需要require。用字符串创建的缓冲区可以接受一个可选的编码参数来指定字符串的编码方式。可用的toString和Buffer构造函数编码如下:

'ascii' - for 7 bit ASCII data only. This encoding method is very fast, and will strip the high bit if set. 'utf8' - Multi byte encoded Unicode characters. Many web pages and other document formats use UTF-8. 'ucs2' - 2-bytes, little endian encoded Unicode characters. It can encode only BMP(Basic Multilingual Plane, U+0000 - U+FFFF). 'base64' - Base64 string encoding. 'binary' - A way of encoding raw binary data into strings by using only the first 8 bits of each character. This encoding method is deprecated and should be avoided in favor of Buffer objects where possible. This encoding will be removed in future versions of Node.

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

你可以通过npm安装Buffer

你可以像这样在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

我使用下面的代码来解码Node.js API中的Base64字符串,Node.js版本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 + '"');

请不要尝试在浏览器的控制台中运行上述代码。这是行不通的。将代码放在Node.js的服务器端文件中。我在API开发中使用了上面的代码。

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

我创建了一个终极的小型JavaScript npm库,用于在Node.js中进行Base64编码/解码转换。

安装

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