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