假设您具有与Java代码相同的密码字符串,则可以在节点中创建如下的密钥缓冲区:
var key = new Buffer(password, "utf8");
由于你在Java中使用零填充IV(坏!),这是节点中的等效代码:
var iv = new Buffer(16); // 16 byte buffer with random data
iv.fill(0); // fill with zeros
由于您在Java中使用CBC模式,因此必须在节点中执行相同操作.请注意,根据您的“密码”长度选择密码字符串时,您必须选择正确的密钥大小:
var aesCipher = mCrypto.createCipheriv("aes-128-cbc", key, iv);
// or
var aesCipher = mCrypto.createCipheriv("aes-192-cbc", key, iv);
// or
var aesCipher = mCrypto.createCipheriv("aes-256-cbc", key, iv);
Node将自动应用PKCS#7填充,这与AES的PKCS#5填充相同.
密码不是关键!
密码通常没有用作密钥的适当长度(AES的有效长度为16字节,24字节和32字节)并且它仅包含可打印字符,这可能使攻击者更容易强制密钥.
从密码创建密钥所需的是密钥派生功能.流行的是PBKDF2,bcrypt和scrypt(成本增加).
随机四!
你真的应该为你生成的每个密文生成一个新的随机IV.如果您使用静态IV,则观察您的密文的攻击者可以确定您发送了相同甚至类似的消息.如果你使用随机IV,那么密文差别很大,攻击者无法确定是否有两个不同的密文是从同一个明文创建的.这称为语义安全性.
随机IV本身不必是秘密的,因此您可以轻松地将其添加到密文并在解密之前将其切片.
您甚至可以将其与密钥派生函数(KDF)结合使用.只需为KDF生成随机盐. KDF通常能够导出可变数量的输出字节,因此只需让它派生密钥|| IV(连接)然后拆分它们.现在,您只需要将salt添加到密文中.
验证!
根据您的系统,您可能容易受到padding oracle攻击等攻击.对此的最好防御是验证密文.因此,您可以使用具有强MAC的加密 – 然后MAC方案(如HMAC-SHA256)或经过身份验证的操作模式(如GCM或EAX). Java和节点都支持GCM,但还有一些工作要做.