Генерация криптографически безопасных случайных чисел в php - PullRequest
17 голосов
/ 25 июня 2009

Функция PHP rand() не дает хороших случайных чисел. Поэтому я начал использовать mt_rand(), который, как говорят, дает лучшие результаты. Но насколько хороши эти результаты? Есть ли способы улучшить их снова?

Моя идея:

function rand_best($min, $max) {
    $generated = array();
    for ($i = 0; $i < 100; $i++) {
        $generated[] = mt_rand($min, $max);
    }
    shuffle($generated);
    $position = mt_rand(0, 99);
    return $generated[$position];
}

Это должно дать вам "идеальные" случайные числа, не так ли?

Ответы [ 16 ]

1 голос
/ 25 июня 2009

Не существует такого понятия, как «идеальное» случайное число. Неважно, какое у вас субъективное определение «идеальный». Вы можете достичь только псевдослучайного.

Я просто пытался указать вам правильное направление. Вы задали вопрос о совершенных случайных числах, даже если совершенные были в кавычках. И да, вы можете улучшить случайность. Вы даже можете реализовать эвристические или «естественные» алгоритмы, такие идеи, как «атмосферный шум», но, тем не менее, вы не совершенны ни в коем случае.

0 голосов
/ 27 мая 2014

Я создал PHP-класс для генерации случайных чисел и строк PHPRandomValue

Он использует «mcrypt_create_iv (4, MCRYPT_DEV_URANDOM)» для генерации случайных чисел и значений. Я сделал это во время работы над криптографическим проектом, потому что мне нужен был безопасный генератор случайных значений. Вот пример использования

$randomValue = new RandomValue;

$randomValue->randomNumber(): = -3880998

$randomValue->randomNumberBetween(1,10): = 2

$randomValue->randomTextString(): = CfCkKDHRgUULdGWcSqP4

$randomValue->randomTextString(10):  = LorPIxaeEY

$randomValue->randomKey(): = C7al8tX9.gqYLf2ImVt/!$NOY79T5sNCT/6Q.$!.6Gf/Q5zpa3

$randomValue->randomKey(10):  = RDV.dc6Ai/
0 голосов
/ 03 января 2014

Хотя ответ был принят несколько лет назад, я снова открою его.

Поскольку вся эта случайность зависит от системного времени, давайте возьмемся за системное время! Количество времени, которое операция занимает на компьютере, на самом деле довольно изменчиво (особенно, если на этом сервере происходит что-то другое), поэтому, если мы воспользуемся этим с помощью microtime ... (не удалось найти никаких переносимых команд nanotime)

$a='';
for (int $i=0; $i<9001; $i++)
{
    usleep(mt_rand(1000,10000));//Also eliminates timing attacks... possibly?
    $a=hash('SHA512',$a.uniqid(mt_rand().microtime(),true));
}
echo $a;

Номинально это имеет 207023 бита энтропии, так как вы добавляете еще 23 бита на каждую итерацию, но есть много взаимозависимостей, поэтому, вероятно, на несколько порядков меньше. Все еще довольно хорошо.

Вам известны какие-либо операции на PHP, которые занимают действительно случайное количество времени? Как ... HTTP-запрос какого-либо веб-сайта (кроме RANDOM.org) и измерение времени, которое требуется?

0 голосов
/ 13 октября 2013

Tru Случайные числа

<?php
for ($i = -1; $i <= 4; $i++) {
    $bytes = openssl_random_pseudo_bytes($i, $cstrong);
    $hex   = bin2hex($bytes);

    echo "Lengths: Bytes: $i and Hex: " . strlen($hex) . PHP_EOL;
    var_dump($hex);
    var_dump($cstrong);
    echo PHP_EOL;
}
?>

, а также криптозащита;)

0 голосов
/ 26 апреля 2013

Используя random.org, вы можете использовать это:

function getToken($length, $min, $max){
    $r = explode('
',file_get_contents('http://www.random.org/integers/num='.$length.'&min='.$min.'&max='.$max.'&col=1&base=10&format=plain'));

    $string = '';
    foreach ( $r as $char ) $string.=$char;
    return $string;
}

это должно дать реальные случайные числа

0 голосов
/ 25 июня 2009

Невозможно сгенерировать истинные случайные числа, лучшее, на что вы можете надеяться - это псевдослучайное, что обеспечивает rand (), ваша функция не ближе к случайной, чем rand (). Взгляните на это http://en.wikipedia.org/wiki/Random_number_generator

...