PHP генератор случайных строк

Я пытаюсь создать рандомизированную строку в PHP, и я не получаю абсолютно ничего с этим:

<?php
    function RandomString()
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < 10; $i++) {
            $randstring = $characters[rand(0, strlen($characters))];
        }
        return $randstring;
    }

    RandomString();
    echo $randstring;

Что я делаю не так?

751
задан Peter Mortensen 18 July 2019 в 13:38
поделиться

3 ответа

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

Простой, безопасный и правильный ответ - использовать RandomLib и не изобретать велосипед.

Для тех из вас, кто настаивает на изобретении собственного решения, PHP 7.0.0 предоставит random_int() для этой цели; если вы все еще используете PHP 5.x, мы написали PHP 5 polyfill для random_int() , чтобы вы могли использовать новый API даже до обновления до PHP 7.

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

С безопасным целочисленным генератором на месте генерация случайной строки с CSPRNG - прогулка в парке.

Создание безопасной случайной строки

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

Использование :

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');

Демонстрация : https: // 3v4l.org/b4PST (Игнорировать сбои PHP 5; требуется случайный компас)

295
ответ дан Scott Arciszewski 18 July 2019 в 13:38
поделиться

С тех пор php7, существуют функции random_bytes. https://www.php.net/manual/ru/function.random-bytes.php, Таким образом, можно генерировать случайную строку как этот

<?php
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));
?>
3
ответ дан 22 November 2019 в 21:24
поделиться

Вот является мое простое одним решением для строки генерировать использование дружественный случайный пароль, исключая символы, что двойник такой как "1" и "l", "O" и "0", и т.д.... здесь это - 5 символов, но можно легко изменить его, конечно:

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);
1
ответ дан 22 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: