crypto.createCipheriv - > cipher.update + cipher.final不返回Buffer?

Mam*_*aac 3 javascript node.js

我创建了一个传递两个缓冲区的密码.buf1是键,32字节缓冲区,buf2是IV,也是32字节缓冲区,我切片只使用16字节.文档说cipher.update和cipher.final在没有指定任何内容时返回缓冲区.这实际上就是我希望发生的事情.虽然我想我可以做一个新的缓冲区(加密,'二进制')来转换它,我想知道我是否可能做错了什么.

> var cipher = crypto.createCipheriv('aes-256-cbc', buf1, buf2.slice(0,16));
undefined
> var crypted = cipher.update(new Buffer('this is some test'));
undefined
> crypted += cipher.final();
'!t\u001f\u0004>.\u0012\u0001???K\u001bSiA?]3\u0017?6?&?.??\u0015?V?'
0> Buffer.isBuffer(crypted)
false
Run Code Online (Sandbox Code Playgroud)

http://nodejs.org/api/crypto.html#crypto_class_cipher

我正在使用node.js版本0.10.10,这是最新的稳定版,据说与链接的文档匹配:

$ node -v
v0.10.10
Run Code Online (Sandbox Code Playgroud)

这是文档错误还是我的错误?我知道用v0.8 pbkdf2返回一个二进制字符串而不是缓冲区,现在用0.10.10返回一个缓冲区,如文档所述.我希望密码也可以使用缓冲区而不是使用二进制...来保持一致性.

mat*_*hat 6

你正在使用+=它们将缓冲区转换为字符串.你的代码应该是这样的:

var cipher = crypto.createCipheriv('aes-256-cbc', buf1, buf2.slice(0,16));
var cryptedBuffers = [cipher.update(new Buffer('this is some test'))];
cryptedBuffers.push(cipher.final());

// at this point `cryptedBuffers` is an array of buffers which you can turn 
// into a single buffer by doing

var crypted = Buffer.concat(cryptedBuffers);
Run Code Online (Sandbox Code Playgroud)