由于某些奇怪的原因,Node内置的Cipher
和Decipher
类未按预期工作。该documentation指出cipher.update
Node.js Crypto AES密码
“返回的加密内容,并且在其流可以被称为新的数据很多次了。”
的docs还指出cipher.final
“返回任何剩余的加密内容。”
然而,在我的测试中,你必须电话向cipher.final
获取所有数据,从而使密码对象毫无价值,并且处理您必须创建一个新的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
或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
对象?这看起来很昂贵,如果我这样做是一个流的一部分。
禁用填充是不安全的 –
感谢您的提示。在上下文中,这并不重要,因为我试图在安全性不重要的环境中模拟安全系统的协议。 – skeggse
is atuo padding salt –