Совместимость Linux с Windows с dev / urandom, есть ли лучший подход?

Привет, я хочу использовать пакет под названием 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

2

Решение

Вы должны использовать openssl_random_pseudo_bytes() генерировать случайные строки по двум причинам:

  1. Так же безопасно, как и при использовании /dev/random
  2. Можно использовать в Windows или Linux

Но вы должны включить расширение OpenSSL в PHP, иначе вы получите ошибку.

Код:

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;
}
2

Другие решения

Других решений пока нет …