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

mur*_*lai 787 base64 encoding node.js

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');
Run Code Online (Sandbox Code Playgroud)

根据文档,update()可以输出base64编码的数据.但是,final()不支持base64.我试过了,它会破裂.

如果我这样做:

var ciph = cipher.update(plaintext, 'utf8', 'base64');
    ciph += cipher.final('hex');
Run Code Online (Sandbox Code Playgroud)

然后我应该用什么解密?Hex或base64?

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

谢谢.

ont*_*ia_ 1851

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

> console.log(Buffer.from("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
> console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'))
Hello World
Run Code Online (Sandbox Code Playgroud)

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

'ascii' - 仅适用于7位ASCII数据.这种编码方法非常快,如果设置将剥离高位.

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

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

'base64' - Base64字符串编码.

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

  • const atob =(数据)=> Buffer.from(数据,'base64')。toString('ascii');` (2认同)

Not*_*ese 207

接受的答案包含在大于6的节点版本中被视为安全问题的内容(尽管此用例似乎可能始终将输入强制转换为字符串).

new Buffer()构造是根据过时文件.

以下是在ws库中使用它可能导致的漏洞示例.

代码段应为:

console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));
Run Code Online (Sandbox Code Playgroud)

  • 为了节省你几分钟,我试图看到这个例子和接受的答案中的一个之间的差异,接受的答案现在更新为这个答案所暗示的. (64认同)
  • 此错误发生在早于v6的节点版本上.在这些版本中,您需要使用构造函数(`new Buffer`)而不是`Buffer.from`. (7认同)

Jav*_*ero 40

crypto现在支持base64(参考):

cipher.final('base64') 
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

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');
Run Code Online (Sandbox Code Playgroud)

  • 有什么理由在 NotJavanese 的答案上使用它? (3认同)
  • 不得不匹配Node和Python之间的加密,这个答案给我一个问题!谢谢 :) (3认同)
  • 这是不正确的,因为您不能仅附加多个 Base64 字符串并获得正确连接的 Base64 字符串。仅当更新函数返回长度可被 4 整除的块时,此方法才有效,但对此没有任何保证。 (2认同)

Vis*_*kur 12

缓冲器可用于获取字符串或数据并对结果进行 Base64 编码。例如:

您可以安装缓冲区,如下所示: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
Run Code Online (Sandbox Code Playgroud)