Pertanyaan Ubah nilai acak dari / dev / urandom


Seperti yang disebutkan di komentar dari mt_rand() itu lemah dalam keamanan dan kita harus menggunakan / dev / urandom sebagai gantinya. Masalah saya adalah bahwa dari urandom saya mendapatkan string biner.

Bagaimana cara mengonversi string biner ini ke 0-9a-zA-Z?

Seperti base_convert() tidak berfungsi di sini.


4
2017-12-08 10:47


asal


Jawaban:


Hanya untuk merekam fungsi penuh:

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

3
2017-12-08 11:03



Kamu dapat memakai bin2hex untuk konversi biner ke string. Dan PHP 7 random_bytes menambahkan pencarian urandom.

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

2
2018-06-08 09:08



gunakan saja base64_encode($yourbinaryurandomstring)

dengan hasil itu Anda dapat mis. menggunakan fungsi hash seperti sha1() atau md5() dan seharusnya baik-baik saja. Anda bahkan tidak melakukan konversi apa pun "="

Saya tidak yakin apakah fungsi hash dapat membaca string biner untuk mereka sendiri, coba saja.


1
2017-12-08 11:00



Salah satu cara menggunakan /dev/urandom adalah fungsinya uiniqid yang seharusnya sesuai dengan kebutuhan Anda.

Namun, jika Anda membutuhkannya nomor acak yang benar Anda sebaiknya menggunakan lebih baik /dev/random sebagai /dev/urandom masih merupakan pembangkit bilangan acak pseudo yang digunakan /dev/random untuk nilai benih.

Mengakses aliran angka acak tidak sesulit itu.

<?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]);
?>

Tentunya ini bukan kode produksi.


1
2017-12-08 11:06