在 openssl_random_pseudo_bytes()
和 mcrypt_create_iv()
的输出上使用 bin2hex()
将它们改为十六进制是否安全可靠用作 IV 的二进制原始数据,还是存在安全风险且不建议这样做?
最佳答案
对于大多数分组密码模式,初始化向量 (IV) 至多是 block 大小的大小。它的用途是随机化加密,这样如果您使用相同的 key 加密相同的消息,每次都会得到不同的结果。这是语义安全的一个重要属性。
如果将 openssl_random_pseudo_bytes()
的原始输出编码为十六进制,则 IV 的一半位会丢失为已知值 (0)。
示例:
CBC 模式中 IV 的重要属性是它必须不可预测。如果您使用 block 大小为 128 位的 AES,那么这将导致 IV 具有 64 个可变位,这使得预测 IV 变得更容易,但不一定简单。请参阅this example .
在CTR模式中,IV必须唯一,通常称为nonce。如果重复使用 IV,那么就有可能推断出原始消息和新消息的明文。如果您使用 AES,那么通常使用 96 位的 IV,但您的十六进制编码会将其减少到 48 个可变位。如果我们考虑生日悖论,则使用相同 key 进行 224 次加密后,您可能会看到相同的 IV。基本上,这会很快破坏系统的安全性。即使对于具有相同 key 的少量消息,具有较小块大小的 block 密码(例如 DES)的行为也完全破坏了安全性。
始终使用 openssl_random_pseudo_bytes()
和 mcrypt_create_iv()
的完整原始输出作为 IV 或 key 。使用更少的熵可以改善生活对于您系统的攻击者来说,这要容易得多。
但是,您可以使用 bin2hex()
和 base64_encode()
打印此类随机生成的字节以用于调试目的或基于文本的传输,但不要忘记在再次使用它们之前将它们解码为不可打印的对应项。
关于php - 在 openssl_random_pseudo_bytes 的输出上使用 bin2hex() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681875/