NodeJS:如何将base64编码的字符串解码为二进制?

384
我正在实现带盐的密码哈希,因此我生成了二进制盐,对密码进行了哈希处理,然后对密码和盐进行了base64编码,并将它们存储到数据库中。
现在当我检查密码时,我需要将盐解码回二进制数据,使用它来哈希提供的密码,对结果进行base64编码并检查是否与数据库中的结果匹配。
问题是,我找不到一种方法将盐解码回二进制数据。我使用Buffer.toString方法对它们进行了编码,但似乎没有相反的函数可以解码。
1个回答

812

截至Node.js v6.0.0版本,使用构造函数方法已被弃用,应使用以下方法从base64编码字符串构造新缓冲区:

var b64string = /* whatever */;
var buf = Buffer.from(b64string, 'base64'); // Ta-da

针对 Node.js v5.11.1 及以下版本

构建一个新的 Buffer,并将'base64'作为第二个参数传入:

var b64string = /* whatever */;
var buf = new Buffer(b64string, 'base64'); // Ta-da

如果你想要保持清洁,你可以检查 from 是否存在:

if (typeof Buffer.from === "function") {
    // Node 5.10+
    buf = Buffer.from(b64string, 'base64'); // Ta-da
} else {
    // older Node versions, now deprecated
    buf = new Buffer(b64string, 'base64'); // Ta-da
}

2
不是那么糟糕,第三个构造函数就在那里。 - Matt Ball
43
对于那些正在寻找反向方法的人 - ( new Buffer( str ) ).toString( "base64" )。 (说明:这是一段代码,其中“str”是要进行Base64编码的字符串,使用此代码可以将其转换为Base64格式。) - Nikolay Tsenkov
14
现在这种方法已经过时了,正确的方法是: var buf = Buffer.from(b64string, 'base64'); 请参考此处链接:https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings - Kristoffer Dorph
4
FYI,这段代码似乎无法在旧版的Node上运行。在Node 4.3.6上,Buffer.from仍然是一个函数,但会出现“TypeError: base64不是一个函数”的错误。 - Doug
21
如果 toString('ascii') 对您无效,请尝试使用此方法: Buffer.from(string, 'base64').toString('utf-8') - joeytwiddle
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接