【问题标题】:Convert random values from /dev/urandom从 /dev/urandom 转换随机值
【发布时间】:2016-06-08 17:13:29
【问题描述】:

正如comments of mt_rand() 中提到的那样,它的安全性很弱,我们应该使用 /dev/urandom 来代替。我的问题是从 urandom 我得到一个二进制字符串。

如何将此二进制字符串转换为 0-9a-zA-Z?

看起来base_convert() 在这里不起作用。

【问题讨论】:

  • 您能否为我们提供更多有关该问题的背景信息。可能有更好的解决方案来满足您的需求,例如 uniqid()
  • 为什么应该例如base64_encode() 不起作用?
  • 嗯,确实如此!只需要转换一些像 =/ 这样的字符,但我不能接受你在这里回答;)
  • 好的,给你了 :)

标签: php random


【解决方案1】:

只是为了记录完整的功能:

function randomFromDev($len)
{
    $fp = @fopen('/dev/urandom','rb');
    $result = '';
    if ($fp !== FALSE) {
        $result .= @fread($fp, $len);
        @fclose($fp);
    }
    else
    {
        trigger_error('Can not open /dev/urandom.');
    }
    // convert from binary to string
    $result = base64_encode($result);
    // remove none url chars
    $result = strtr($result, '+/', '-_');
    // Remove = from the end
    $result = str_replace('=', ' ', $result);
    return $result;
}

【讨论】:

    【解决方案2】:

    您可以使用bin2hex 进行二进制到字符串的转换。 并且 PHP 7 random_bytes 添加了 urandom 查找。

    <?php
    $bytes = random_bytes(5);
    $str = bin2hex($bytes);
    var_dump($str);
    // string(10) "385e33f741" 
    ?>
    

    【讨论】:

      【解决方案3】:

      只需使用base64_encode($yourbinaryurandomstring)

      有了这个结果,你可以例如使用像sha1()md5() 这样的哈希函数应该没问题。你甚至没有做任何"="的转换

      我不太确定哈希函数是否可以自己读取二进制字符串,请尝试一下。

      【讨论】:

      • 谢谢!不,今天我没有散列函数。刚刚拥有topic ;)
      【解决方案4】:

      /dev/urandom 的一种使用方式是 uiniqid 函数,它应该满足您的需求。

      但是,如果您需要真正的随机数,您最好使用/dev/random,因为/dev/urandom 仍然是一个伪随机数生成器,它使用/dev/random 作为种子值。

      访问随机数流并不难。

      <?php
      $r = unpack('v*', fread(fopen('/dev/random', 'r'),16));
      $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
          $r[1], $r[2], $r[3], $r[4] & 0x0fff | 0x4000, 
          $r[5] & 0x3fff | 0x8000, $r[6], $r[7], $r[8]);
      ?>
      

      显然这不是生产代码。

      【讨论】:

      • 加密安全的 PRNG 对于加密仍然有用。 /dev/random 是否给你它的实际熵池很大程度上取决于操作系统。在 FreeBSD 中两者是相同的,使用 Yarrow。
      • 是的,我知道第一部分,但我不想让我的答案过于臃肿。
      • 关于uniqid():“此函数不会创建随机或不可预测的字符串。此函数不得用于安全目的。使用密码安全的随机函数/生成器和密码安全的哈希函数来创建不可预测的字符串安全 ID。” (来自 PHP 文档)
      • /dev/urandom 不是伪的,不像randmt_rand。在更糟糕的情况下,它会从一个不断刷新的真正随机池中创建随机数。大多数时候它和/dev/random一样好。
      • /dev/random 不是 more 随机的,/dev/random 和 /dev/urandom 使用完全相同的 CSPRNG。如需阅读,请参阅:2uo.de/myths-about-urandom
      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多