【问题标题】:Is it secure to use bin2hex() on output of openssl_random_pseudo_bytes?在 openssl_random_pseudo_bytes 的输出上使用 bin2hex() 是否安全?
【发布时间】:2016-04-13 10:06:10
【问题描述】:

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

【问题讨论】:

  • 如何构成安全风险?您所做的只是获取一些字节并将它们转换为其他一些字节。风险来自您如何使用这些字节。
  • 如果将某些字节转换为其他字节与安全性无关,那么为什么那些 php 函数和 random_bytes() 会存在呢?因为任何人都可以生成一些随机字节?
  • 因为 bin2hex 并没有从根本上改变字节,它只是将它们转换为不同的显示格式。价值观不会改变,只是人类如何看待它们。它们仍然是随机字节,它们只是可打印为十六进制值,而不是屏幕上的“垃圾”。
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Cryptography Stack ExchangeInformation Security Stack Exchange 会是一个更好的提问地点。

标签: php openssl cryptography mcrypt initialization-vector


【解决方案1】:

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

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

例子:

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

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


始终将 openssl_random_pseudo_bytes()mcrypt_create_iv() 的完整原始输出用于 IV 或密钥。使用更少的熵可以大大简化系统攻击者的工作。

但是,您可以使用bin2hex()base64_encode() 打印这些随机生成的字节以进行调试或基于文本的传输,但不要忘记在再次使用它们之前将它们解码为不可打印的对应部分。

【讨论】:

  • 旁注:PHP 实现不符合cryptography coding standards,因此可能会通过缓存未命中的时间差异泄漏信息。目前没有很好的缓解措施,尽管 PHP 7.1 可能会修复它。我还没有看到任何实际的漏洞,所以这可能没什么大不了的。
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多