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

时间:2013-06-07 18:48:32

标签: javascript node.js

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

> 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

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

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

$ node -v
v0.10.10

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

1 个答案:

答案 0 :(得分: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);