在节点js模块中使用加密的无效IV长度

时间:2019-12-12 07:40:26

标签: node.js express encryption cryptojs cryptoapi

这是我的代码

const crypto = require('crypto')
const algorithm = 'aes-256-cbc';
const key = 't\ufffdy\u0005\ufffdH\ufffd\u0015\ufffdCh\ufffdı\ufffd\ufffd\ufffd>\ufffd(d\ufffd3\ufffd\ufffd\ufffd\ufffd\ufffd\' 4'

const iv = '\u0005\ufffd\ufffd\ufffd\ufffdKV`\u0007z\ufffd\"H\ufffd\u0013\ufffd'

exports.postMessage = (req,res,next) =>{

    //   var buf= Buffer.from(crypto.randomBytes(16)).toString()

    //   return res.json(iv.length)

    function encrypt(text) {
        let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
        let encrypted = cipher.update(text);
        encrypted = Buffer.concat([encrypted, cipher.final()]);
        return res.json({ iv: iv.toString('hex').slice(0, 16), encryptedData: encrypted.toString('hex') });
       }
      encrypt('some text')
}
  

错误:错误:IV长度无效       在Cipheriv.createCipherBase(内部/密码/cipher.js:79:18)       在Cipheriv.createCipherWithIV(internal / crypto / cipher.js:115:20)       在新的Cipheriv上(internal / crypto / cipher.js:217:22)       在Object.createCipheriv(crypto.js:109:10)

1 个答案:

答案 0 :(得分:0)

AES之后的256表示密钥大小而不是块大小。 AES具有128位,192位和256位大小,并且始终具有128位块大小。当您使用需要IV随机化加密的CBC模式且IV大小等于块大小时。在这种情况下,它是128位,即16字节。因此,请确保您的IV完全为16字节。

如果您只是开始一个项目,请不要使用CBC模式,它是一种古老的操作模式,并且存在很多问题。例如,对于您来说,它是固定的,并且是灾难性的,您将CBC变成了ECB。在CBC模式下,同一密钥下的IV不能重复使用。除此之外,IV必须是不可预测的。您可以使用

var iv = Crypto.randomBytes(16);

创建一个随机IV。

在密钥大小128下,应该在生成2 ^ 64个随机IV之前停止,请参见生日悖论。在您的情况下,密钥大小为256,我们不希望一个好的随机IV生成器会再次击中相同的IV。

对于启动新项目,请使用AES-GCM之类的经过身份验证的加密模式,该模式将为您提供机密性,完整性和身份验证。