bin2hex()
在输出上使用openssl_random_pseudo_bytes()
并将mcrypt_create_iv()
它们作为十六进制而不是二进制原始数据用作 IV是否安全可靠,或者这是一种安全风险并且不推荐?
1 回答
对于大多数块密码模式,初始化向量 (IV) 最多是块大小的大小。它的用途是使加密随机化,这样如果您使用相同的密钥加密相同的消息,每次都会出现不同的结果。这是语义安全的一个重要属性。
如果将原始输出编码openssl_random_pseudo_bytes()
为十六进制,则将 IV 的一半位设置为已知值 (0)。
例子:
CBC 模式中 IV 的重要特性是它必须是不可预测的。如果您使用块大小为 128 位的 AES,那么这将产生一个具有 64 个变量位的 IV,这使得预测 IV 更容易,但不一定容易。请参阅此示例。
在CTR 模式下,IV 必须是唯一的,通常称为 nonce。如果IV被重用,那么就有可能推导出原始消息和新消息的明文。如果您使用 AES,则通常使用 96 位的 IV,但您的十六进制编码会将其减少到 48 个可变位。如果我们考虑生日悖论,您可能会在使用相同密钥进行 2 24次加密后看到相同的 IV。基本上,这会很快破坏系统的安全性。具有较小块大小的块密码(例如 DES)的行为完全破坏了安全性,即使对于具有相同密钥的少量消息也是如此。
始终使用openssl_random_pseudo_bytes()
和mcrypt_create_iv()
用于 IV 或密钥的完整原始输出。使用更少的熵可以使系统攻击者的生活变得相当容易。
但是,您可以使用bin2hex()
andbase64_encode()
打印这些随机生成的字节以用于调试目的或基于文本的传输,但不要忘记在再次使用它们之前将它们解码为不可打印的对应部分。