Выдает ли mt_rand достаточно безопасные результаты для генерации токенов на предъявителя?

Для моих клиентов мне нужно создать токены носителя, чтобы иметь возможность аутентифицироваться в моем API. Следовательно, чтобы создать их, мне пришло в голову random_bytes: https://www.php.net/manual/en/function.random-bytes.php

Но в реализации, которую я видел с использованием mt_rand, вместо этого используется именно этот фрагмент кода:

function gen_bearerToken(int length): string
{
  $bearer="";
  $pool='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ';
  for($i=0;i<$length;i++){
     $bearer .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
  }

  return $bearer;
}

Но, как я вижу, mt_rand https://www.php.net/manual/en/function.mt-rand.php не генерирует криптографически безопасные случайные байты, поэтому я предполагаю, что будут сгенерированы слабые токены, которые легко угадать.

Кроме того, история доказала, что специальные решения часто терпят неудачу с точки зрения безопасности, а не проверенные временем решения. Я ошибаюсь, чтобы беспокоиться, или с достаточно большой длиной (> 100) я буду в порядке с точки зрения безопасности?


person Dimitrios Desyllas    schedule 17.10.2019    source источник
comment
Многие атаки против слабых ГПСЧ в основном теоретические. На практике будет ли злоумышленник достаточно заинтересован в вашем конкретном сервисе, чтобы атаковать его настолько глубоко, что атака на слабый PRNG станет их первым или единственным вектором атаки…? Вероятно, а) никто не будет атаковать вас конкретно на такой глубине и б) вероятно, есть другие проблемы, на которых злоумышленники сосредоточатся в первую очередь. Если вы знаете, что mt_rand слабый, зачем вообще беспокоиться об этом вместо того, чтобы использовать заведомо исправный PRNG?   -  person deceze♦    schedule 17.10.2019
comment
Рассмотрите возможность использования php.net/manual/en/function.random-int. php   -  person Elias Soares    schedule 17.10.2019