在 openssl_random_pseudo_bytes 的输出上使用 bin2hex() 是否安全?

Is it secure to use bin2hex() on output of openssl_random_pseudo_bytes?

openssl_random_pseudo_bytes()mcrypt_create_iv() 的输出上使用 bin2hex() 将它们作为十六进制而不是二进制原始数据用作 IV 是否安全可靠,或者这是安全风险,不推荐?

对于大多数分组密码模式,初始化向量 (IV) 的大小最多为块大小。它的用途是随机化加密,这样如果您使用相同的密钥加密相同的消息,每次都会产生不同的结果。这是语义安全的重要 属性。

如果您将 openssl_random_pseudo_bytes() 的原始输出编码为十六进制,那么您会将 IV 的一半位设置为已知值 (0)。

示例:

CBC模式中IV的重要属性是必须不可预测。如果您使用块大小为 128 位的 AES,那么这将导致 IV 具有 64 个可变位,这使得预测 IV 更容易,但不一定 easy。参见 this example

CTR模式中,IV必须唯一,通常称为nonce。如果 IV 被重用,那么就有可能推断出原始消息和新消息的明文。如果您使用 AES,那么通常使用 96 位的 IV,但是您的十六进制编码会将其减少到 48 个可变位。如果我们考虑生日悖论,您可能会在使用相同密钥进行 224 次加密后看到相同的 IV。基本上,这会很快破坏系统的安全性。具有较小块大小的块密码(例如 DES)的行为完全破坏了安全性,即使对于具有相同密钥的少量消息也是如此。


始终将 openssl_random_pseudo_bytes()mcrypt_create_iv() 的完整原始输出用于 IV 或密钥。 使用较少的熵可以让你的攻击者活下来系统相当简单。

但是,您可以使用 bin2hex()base64_encode() 打印此类随机生成的字节以用于调试目的或 text-based 传输,但不要忘记将它们解码为不可打印的副本在再次使用它们之前。