Найти имена функций в разделе .init_array в несжатой библиотеке

Я просто искал, как решить эту проблему, но также хочу, чтобы моя функция создавала токен, который также можно использовать для поиска пароля. Это означает, что мне нужно ограничить способность маркера быть угаданным. Поскольку uniqid основано на времени, и согласно php.net «возвращаемое значение мало отличается от microtime ()», uniqid не соответствует критериям. PHP рекомендует использовать openssl_random_pseudo_bytes() вместо этого для генерации криптографически защищенных токенов.

Быстрый, короткий и точечный ответ:

bin2hex(openssl_random_pseudo_bytes($bytes))

, который генерирует случайную строку буквенно-цифровых символов length = $ bytes * 2. К сожалению, у этого есть только алфавит [a-f][0-9], но он работает. Ниже приведена самая сильная функция, которую я мог бы сделать, которая удовлетворяет критериям (это реализованная версия ответа Эрика).

function crypto_rand_secure($min, $max)
{
    $range = $max - $min;
    if ($range < 1) return $min; // not so random...
    $log = ceil(log($range, 2));
    $bytes = (int) ($log / 8) + 1; // length in bytes
    $bits = (int) $log + 1; // length in bits
    $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
    do {
        $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
        $rnd = $rnd & $filter; // discard irrelevant bits
    } while ($rnd > $range);
    return $min + $rnd;
}

function getToken($length)
{
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen($codeAlphabet); // edited

    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
    }

    return $token;
}

crypto_rand_secure($min, $max) работает как сокращение замены для rand() или mt_rand , Он использует openssl_random_pseudo_bytes, чтобы создать случайное число между $ min и $ max.

getToken($length) создает алфавит для использования в токене, а затем создает строку длины $length.

EDIT: Я пренебрег ссылкой на источник - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322 ]

EDIT (PHP7): С выпуском PHP7 стандартная библиотека теперь имеет две новые функции, которые могут заменить / улучшить / упростить функцию crypto_rand_secure выше. random_bytes($length) и random_int($min, $max)

http://php.net/manual/en/function.random-bytes.php

http://php.net/manual/en/function.random-int.php

Пример:

function getToken($length){
     $token = "";
     $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
     $codeAlphabet.= "0123456789";
     $max = strlen($codeAlphabet); // edited

    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[random_int(0, $max-1)];
    }

    return $token;
}

0
задан Arpit Aggarwal 27 February 2019 в 15:25
поделиться