【问题标题】:Invalid IV LENGTH using crypto in node js module在节点 js 模块中使用加密的 IV LENGTH 无效
【发布时间】:2019-12-12 07:40:26
【问题描述】:

这是我的代码

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 (internal/crypto/cipher.js:79:18) 在 Cipheriv.createCipherWithIV (internal/crypto/cipher.js:115:20) 在新密码 (internal/crypto/cipher.js:217:22) 在 Object.createCipheriv (crypto.js:109:10)

【问题讨论】:

  • IV 的大小是 26 字节,但应该是 32。最好生成随机 IV 并将其与消息一起传递 - 即不要使用可预测的纯文本重用它,因为它会生成它轻松恢复您的密钥

标签: node.js express encryption cryptojs cryptoapi


【解决方案1】:

AES 后面的 256 代表密钥大小而不是块大小。 AES 具有 128、192 和 256 位大小,并且始终具有 128 位块大小。当您使用需要 IV 来随机化加密并且 IV 大小等于块大小的 CBC 模式时。在这种情况下,它是 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,它可以为您提供机密性、完整性和身份验证。

【讨论】:

    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2021-06-17
    相关资源
    最近更新 更多