出于某种奇怪的原因,Node 的内置Cipher
和Decipher
类没有按预期工作。该文件指出cipher.update
“返回加密的内容,并且可以在流式传输时使用新数据多次调用。”
文档还指出cipher.final
“返回任何剩余的加密内容。”
但是,在我的测试中,您必须调用cipher.final
以获取所有数据,从而使 Cipher 对象变得毫无价值,并且要处理下一个块,您必须创建一个新的 Cipher 对象。
var secret = crypto.randomBytes(16)
, source = crypto.randomBytes(8)
, cipher = crypto.createCipher("aes128", secret)
, decipher = crypto.createDecipher("aes128", secret);
var step = cipher.update(source);
var end = decipher.update(step);
assert.strictEqual(source.toString('binary'), end); // should not fail, but does
请注意,当使用crypto.createCipher
or时会发生这种情况crypto.createCipheriv
,其中密钥作为初始化向量。解决方法是将第 6 行和第 7 行替换为以下内容:
var step = cipher.update(source) + cipher.final();
var end = decipher.update(step) + decipher.final();
但是,如前所述,这会使两者都cipher
变得decipher
毫无价值。
这就是我希望 Node 的内置密码学能够工作的方式,但它显然没有。这是我如何使用它的问题还是 Node 中的错误?还是我期待错误的事情?我可以直接去实现 AES,但这既费时又烦人。每次需要加密或解密时,我是否应该只创建一个新对象Cipher
或对象?Decipher
如果我将其作为流的一部分这样做,那似乎很昂贵。