Linux与windows兼容dev / urandom,有更好的方法吗?

时间:2016-01-17 09:37:54

标签: php linux windows compatibility csrf-protection

您好我想在我的项目

上使用名为Kunststube-CSRFP的软件包

问题是软件包会在Windows机器上抛出异常,因为dev / random对Windows来说不合法。

该函数导致异常低于..

protected function getRandomHexStringFromDevRandom($length) {
        static $sources = array('/dev/urandom', '/dev/random');
        foreach ($sources as $source) {
            if (@is_readable($source)) {
                return bin2hex(file_get_contents($source, false, null, -1, $length / 2));
            }
        }
        throw new \RuntimeException('No system source for randomness available.');
    }

根据php.net,也可以使用mcrypt_create_iv函数。 这是解决此兼容性问题的方法。

protected function getRandomHexStringFromDevRandom($length) {
        //static $sources = array('/dev/urandom', '/dev/random');
        srand(time());
        $iv = mcrypt_create_iv($length, MCRYPT_RAND);

        if($iv){
          return bin2hex($iv);
        }
        throw new \RuntimeException('No system source for randomness available.');
    }

我没有linux机器来测试两个函数是否都返回类似的输出..

我的问题:这个解决方案好吗?还是有更好的方法?谢谢你的帮助......

Php版本:5.5.12

1 个答案:

答案 0 :(得分:2)

您应该使用openssl_random_pseudo_bytes()生成随机字符串,原因有两个:

  1. 与使用/dev/random
  2. 一样安全
  3. 可以在Windows或Linux中使用
  4. 但是你必须在PHP中启用OpenSSL扩展,否则你会收到错误。

    代码:

    protected function getRandomHexStringFromDevRandom($length) {
        if(!extension_loaded("openssl")){
            throw new \RuntimeException("OpenSSL extension not loaded");
        }
        $cstrong = false;
        while(!$cstrong) {
            $rand = openssl_random_pseudo_bytes($length, $cstrong);
        }
        return $rand;
    }