【问题标题】:Converting data from /dev/urandom to hex将数据从 /dev/urandom 转换为十六进制
【发布时间】:2014-02-17 18:53:17
【问题描述】:

在 PHP 应用程序中,我通过从 dev/urandom 读取多个字节来创建会话 ID,然后使用 bin2hex() 将每个字节转换为十六进制。我想知道这种方法是否可行,或者转换为十六进制是否会削弱 SID,因为可能的组合数量减少了?有更好的方法吗?

【问题讨论】:

  • PHP 可以为你自动生成一个会话 id: session_start(); $id = session_id();
  • 是的,谢谢,但我不打算使用本地会话..

标签: php random session-cookies sessionid


【解决方案1】:

bin2hex() 只有在你有字符限制的情况下才会有危险。如果你读取 20 个字节的熵来填充 20 个十六进制字符,你还不如从操作系统中提取 10 个字节。

但是,如果您可以将 20 字节的原始二进制转换为 40 个十六进制字符,则不会发生安全损失。

【讨论】:

    【解决方案2】:

    你的问题真的是“我怎样才能生成一串随机的十六进制数字?” 如果是这样,这就是你的答案(需要 PHP 5.3 或更高版本):

    function getRandomHex($num_bytes=4) {
      return bin2hex(openssl_random_pseudo_bytes($num_bytes));
    }
    

    请注意,如果 $num_bytes > 7,则该值不能在 PHP 中表示为数字而不会丢失精度。一个 5 字节的值(10 个十六进制数字)有大约百万分之一的碰撞机会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2010-10-16
      • 2013-05-31
      • 2018-07-04
      相关资源
      最近更新 更多