Преобразование случайных значений из / dev / urandom

Как упоминалось в комментариях mt_rand() он слаб в безопасности, и мы должны использовать / dev / urandom. Моя проблема в том, что из urandom я получаю двоичную строку.

Как преобразовать эту двоичную строку в 0-9a-zA-Z?

Похоже, что base_convert() здесь не работает.

Related of "Преобразование случайных значений из / dev / urandom"

Только для записи полная функция:

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

Вы можете использовать bin2hex для преобразования двоичного кода в строку. И PHP 7 random_bytes добавил поиск urandom.

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

просто используйте base64_encode($yourbinaryurandomstring)

с этим результатом вы можете, например, использовать хэш-функцию, такую ​​как sha1() или md5() и должны быть точными. Вы даже не делаете никакого преобразования "="

Я не совсем уверен, что хэш-функции могут читать двоичную строку самостоятельно, просто попробуйте.

Одним из способов использования /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]); ?> 

Очевидно, это не производственный код.