首页 文章

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

提问于
浏览
655

node.js有内置的base64编码吗?

我之所以这么说是因为 crypto 来自 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编码 .

谢谢 .

3 回答

  • 32

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

    根据documentation,不推荐使用 Buffer 构造函数 .

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

    代码段应为:

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

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

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

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

    'ascii' - 仅适用于7位ASCII数据 . 这种编码方法非常快,如果设置将剥离高位 . 'utf8' - 多字节编码的Unicode字符 . 许多网页和其他文档格式使用UTF-8 . 'ucs2' - 2字节,小端编码的Unicode字符 . 它只能编码BMP(基本多语言平面,U 0000 - U FFFF) . 'base64' - Base64字符串编码 . 'binary' - 一种通过仅使用每个字符的前8位将原始二进制数据编码为字符串的方法 . 不推荐使用此编码方法,应尽可能避免使用Buffer对象 . 在将来的Node版本中将删除此编码 .

  • 1584

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

相关问题