Рубрики
Uncategorized

Случайные числа в PHP – Вы чувствуете себя надежным?

Автор оригинала: David Wong.

В этой статье в основном анализируется проблема генерации случайных чисел для шифрование цели. PHP 5 не предоставляет простого механизма для генерации строго зашифрованных случайных чисел, но PHP 7 вводит два CSPRNG функция s для решения этой проблемы. Составлен одним инженером APM.

Что такое CSPRNG?

Ссылаясь на определение Википедии, Криптографический безопасный генератор псевдослучайных чисел (CSPRNG)-это генератор псевдослучайных чисел (PRNG) с определенными атрибутами, которые делают его применимым в криптографии.

CSPRNG в основном используется для:

  • Генерация ключей (например, генерация сложных ключей)

  • Генерация случайных паролей для нового пользователя счета

  • Система шифрования

Важным фактором обеспечения высокого уровня безопасности является высокое качество случайных чисел.

CSPRNG в PHP 7

PHP 7 вводит две новые функции для CSPRNG: random_bytes И random_int

random_bytes Возврат функции строка Введите и примите один int Тип-это параметр, определяющий длину возвращаемой строки в байтах.

Например:

$bytes = random_bytes('10');
var_dump(bin2hex($bytes));
//possible ouput: string(20) "7dfab0af960d359388e6"  

Функция random_int возвращает целые числа в заданном диапазоне.

Приведите пример:

var_dump(random_int(1, 100));
//possible output: 27

Закулисная расшифровка

Источники случайных чисел вышеуказанных функций различаются в зависимости от различных сред:

  • В Windows вы можете использовать функцию CryptGenRandom () .

  • Приоритет будет отдаваться другим платформам. arc4random_buf() Функция (ограниченная производная система BSD или система с libbsd).

  • Если два вышеперечисленных пункта не совпадают, будет использоваться системный вызов Linux getRandom (2).

  • Если вышеуказанные источники не соответствуют, они будут выброшены. Ошибка

Простой пример

Хорошая система генерации случайных чисел может гарантировать, что качество сгенерированного случайного числа является подходящим. Для проверки качества необходима серия статистических тестов. Здесь мы не будем подробно обсуждать сложные статистические темы. Сравнение известного поведения с результатами генератора случайных чисел полезно для оценки качества.

Простой тест – игра в кости. Предполагая бросок, вероятность броска 6 равна 1/6. Если вы бросаете три кубика одновременно и бросаете 100 раз, количество раз, когда вы бросаете шесть раз, один раз, два раза и три раза, примерно следующее:

  • 0 раз.9 раз

  • 1 раз.7 раз

  • 2 раза.9 раз

  • 3 раза.5 раз

Вот код для бросания миллиона кубиков:

$times = 1000000;
$result = [];
for ($i=0; $i<$times; $i++){
    $dieRoll = array(6 => 0); //initializes just the six counting to zero
    $dieRoll[roll()] += 1; //first die
    $dieRoll[roll()] += 1; //second die
    $dieRoll[roll()] += 1; //third die
    $result[$dieRoll[6]] += 1; //counts the sixes
}
function roll(){
    return random_int(1,6);
}
var_dump($result);

Использование PHP 7 random_int И простое rand Функциональное тестирование вышеуказанного кода может привести к:

578179 0 579000 579430
347620 1 347000 346927
69586 2 69000 68985
4615 3 5000 4658

Смотрите более интуитивно rand И random_int Разница между двумя группами может быть увеличена с помощью уравнения и показана следующим образом:

php result - expected result / sqrt(expected)

Результаты заключаются в следующем:

(Чем ближе результат, тем лучше)

Несмотря на то, что три комбинации из 6 выполнялись довольно хорошо, а тест был слишком простым для сравнения с реальными приложениями, мы могли ясно видеть, что random_int Отличная производительность rand 。 Более того, чем менее предсказуемо и повторяющееся поведение генератора случайных чисел, тем выше уровень безопасности приложения.

А как насчет PHP 5?

По умолчанию PHP 5 не предоставляет никакого мощного виртуального генератора случайных чисел. На практике это можно использовать. openssl_random_pseudo_bytes()mcrypt_create_iv() Метод или прямая комбинация /dev/случайный или /dev/urandom И читать() Метод. Кроме того, существуют пакеты случайным образом или libsodium.

Если вы хотите использовать лучший генератор случайных чисел, совместимый с PHP 7, вы можете использовать библиотеку random_compat Paragon Initiative. Эта библиотека разрешена для использования в проектах PHP 5.x random_bytes() И random_int() Метод.

Библиотека может быть установлена с помощью Composer:

composer require paragonie/random_compat
require 'vendor/autoload.php';
$string = random_bytes(32);
var_dump(bin2hex($string));
// string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f"
$int = random_int(0,255);
var_dump($int);
// int(81)

random_компакт Библиотека использует последовательность приоритетов, отличную от PHP 7:

  1. Если доступно, сначала используйте READ ()/dev/urandom

  2. mcrypt_create_iv($байт, MCRYPT_CREATE_IV)

  3. COM(‘CAPICOM.Утилиты.1’)->GetRandom()

  4. openssl_random_pseudo_bytes()

Чтобы понять, почему принята эта последовательность приоритетов, вы можете прочитать этот документ.

Простой пример использования библиотеки для генерации паролей выглядит следующим образом:

$passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$passwordLength = 8;
$max = strlen($passwordChar) - 1;
$password = '';
for ($i = 0; $i < $passwordLength; ++$i) {
    $password .= $passwordChar[random_int(0, $max)];
}
echo $password;
//possible output: 7rgG8GHu

резюме

Вам следует попробовать использовать криптографически защищенные виртуальные генераторы случайных чисел. random_компакт Библиотека предоставляет хороший метод реализации для этого.

Если вы хотите использовать надежные источники случайных чисел, начните использовать их как можно скорее, как упоминалось ранее. random_int И random_bytes Сейчас!

Первоначальный адрес: http://www.sitepoint.com/randomness-php-feel-lucky/

OneAPM для PHP может проникать во все приложения PHP для завершения управления производительностью и мониторинга приложений. Он может проникать во все приложения PHP для полного управления производительностью и мониторинга приложений, включая видимость проблем с производительностью на уровне кода, быструю идентификацию и отслеживание узких мест в производительности, мониторинг реального пользовательского опыта, мониторинг серверов и сквозных приложений. Управление эффективностью. Для получения дополнительных технических статей, пожалуйста, посетите официальный технологический блог OneAPM.

Оригинал: “https://developpaper.com/random-numbers-in-php-do-you-feel-reliable/”