【问题标题】:How does an IV work and what would be the best way to store it?IV 如何工作以及存储它的最佳方式是什么?
【发布时间】:2020-12-27 01:49:31
【问题描述】:
我想加密和解密字符串。我为此使用 Nodejs 加密。我读过,在加密和解密时强烈建议使用 IV。我想将加密的数据存储在 MySQL 数据库中,并在以后需要时对其进行解密。我知道我也需要 IV 来进行解密过程。但究竟什么是静脉输液,我应该如何储存它?我读到一些关于静脉注射不能保密的内容。这是否意味着我可以将它存储在它所属的加密数据旁边?
【问题讨论】:
-
如何使用 IV,以及需要、推荐甚至允许什么,取决于您未指定的密码类型和操作模式。有关一些基础知识,请参阅wikipedia;这不是一个真正的编程问题,但是关于许多可能的情况,crypto.SX 和 security.SX 上至少有数百甚至可能数千个 Q。是的,IV 不需要保密,在密文附近存储和/或传输它是一种简单而常见的方法。
标签:
node.js
encryption
cryptography
node-crypto
【解决方案1】:
强烈建议使用静脉输液
不,它是必需的,否则在大多数情况下您将无法获得完全安全的密文。至少,不为相同的密钥和明文消息提供 IV 将导致相同的密文,这会将信息泄露给对手。换句话说:加密将是确定性的,这不是您想要的密码属性。对于 CTR 和 GCM 模式,您可能会泄露所有明文消息...
但究竟什么是 IV ...?
IV 仅由二进制位组成。它的大小和内容取决于操作模式(CBC/CTR/GCM)。通常它需要是随机数或随机数。
CBC 模式需要 16 字节的随机 IV;通常为此使用加密安全的随机数生成器。
CTR 模式通常在 16 字节的 IV 内指定 nonce 和初始计数器值。因此,您已经需要将 nonce 放在左侧字节(最低索引)中。这个 nonce 可能是随机的,但它应该足够大(例如 12 个字节)以避免生日问题。
GCM 模式只需要 12 个字节的随机数。
我应该如何存储它
无论如何,您都可以存储字节,只要它们可以在解密期间检索或重新生成。如果您需要文本,您可能需要使用 base 64 或十六进制对其进行编码(当然,这也适用于密文)。
我读到一些关于静脉注射不能保密的内容。
没错。
这是否意味着我可以将它存储在它所属的加密数据旁边?
正确,IV 通常只是简单地作为密文的前缀;如果您知道分组密码和操作模式,那么大小毕竟是预先确定的。