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

标签 php openssl cryptography mcrypt initialization-vector

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/

相关文章:

ruby-on-rails - 为什么在安装 Rails 时出现 OpenSSL::SSL::SSLError?

c++ - 通过 openssl/c/c++ 以字节形式读取 RSA 公钥

在 Java 中使用 BouncyCaSTLe 的椭圆曲线加密 API 进行加密

php - 将数据传递到 SQL 数据库以进行 JSON 输出时,没有从 PHP 文件接收到文本输出

使用 OpenSSL 计算并打印文件的 SHA256 哈希值

php - 在 php 中搜索 url

c# - .NET 私​​钥 Rsa 加密

php - 在Android中解密Base64加密图像

php - zend 指定的文档类型错误

PHP 使用 id 更新多行并选择