IV 是如何工作的,最好的储存方式是什么?
How does an IV work and what would be the best way to store it?
我想加密和解密字符串。我为此使用 Nodejs 加密。我读过在加密和解密时强烈建议使用 IV。我想将加密数据存储在 MySQL 数据库中,并在以后需要时对其进行解密。我知道我在解密过程中也需要 IV。但究竟什么是 IV,我应该如何储存它?我读到一些关于 IV 不能保密的信息。这是否意味着我可以将它存储在它所属的加密数据旁边?
it's highly recommended to use an IV
不,它是必需的,否则在大多数情况下您将无法获得完全安全的密文。至少,不为相同的密钥和明文消息提供 IV 将导致相同的密文,这会将信息泄露给对手。换句话说:加密是确定性的,这不是您想要的密码 属性 。对于 CTR 和 GCM 模式,您可能会泄露所有明文消息...
But what exactly is an IV ... ?
IV 仅由二进制位组成。它的大小和内容取决于操作模式 (CBC/CTR/GCM)。通常它需要是随机数或随机数。
CBC 模式需要 16 字节的随机 IV;通常为此使用密码安全的随机数生成器。
CTR 模式通常在 16 字节的 IV 中同时指定随机数和初始计数器值。因此,您已经需要将随机数放在左侧字节(最低索引)中。这个 nonce 可能是随机的,但它应该足够大(例如 12 个字节)以避免生日问题。
GCM 模式只需要一个 12 字节的随机数。
and how should I store it
无论如何你都可以存储字节,只要它们可以在解密过程中被检索或重新生成。如果您需要文本,您可能需要使用 base 64 或十六进制对其进行编码(当然,这也适用于密文)。
I read something about that an IV does not to be kept secret.
没错。
Does this mean I can store it right next to the encrypted data it belongs to?
正确,IV 通常只是作为密文的前缀;如果您知道分组密码和操作模式,那么毕竟大小是预先确定的。
我想加密和解密字符串。我为此使用 Nodejs 加密。我读过在加密和解密时强烈建议使用 IV。我想将加密数据存储在 MySQL 数据库中,并在以后需要时对其进行解密。我知道我在解密过程中也需要 IV。但究竟什么是 IV,我应该如何储存它?我读到一些关于 IV 不能保密的信息。这是否意味着我可以将它存储在它所属的加密数据旁边?
it's highly recommended to use an IV
不,它是必需的,否则在大多数情况下您将无法获得完全安全的密文。至少,不为相同的密钥和明文消息提供 IV 将导致相同的密文,这会将信息泄露给对手。换句话说:加密是确定性的,这不是您想要的密码 属性 。对于 CTR 和 GCM 模式,您可能会泄露所有明文消息...
But what exactly is an IV ... ?
IV 仅由二进制位组成。它的大小和内容取决于操作模式 (CBC/CTR/GCM)。通常它需要是随机数或随机数。
CBC 模式需要 16 字节的随机 IV;通常为此使用密码安全的随机数生成器。
CTR 模式通常在 16 字节的 IV 中同时指定随机数和初始计数器值。因此,您已经需要将随机数放在左侧字节(最低索引)中。这个 nonce 可能是随机的,但它应该足够大(例如 12 个字节)以避免生日问题。
GCM 模式只需要一个 12 字节的随机数。
and how should I store it
无论如何你都可以存储字节,只要它们可以在解密过程中被检索或重新生成。如果您需要文本,您可能需要使用 base 64 或十六进制对其进行编码(当然,这也适用于密文)。
I read something about that an IV does not to be kept secret.
没错。
Does this mean I can store it right next to the encrypted data it belongs to?
正确,IV 通常只是作为密文的前缀;如果您知道分组密码和操作模式,那么毕竟大小是预先确定的。