我创建了一个传递两个缓冲区的密码。 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返回一个缓冲区,如文档所述。我希望密码也可以使用缓冲区而不是使用二进制...来保持一致性。
答案 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);