Відповідей на це питання дуже багато, але жодна з них не використовує криптографічно безпечного генератора псевдовипадкових чисел (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)
*
* This function uses type hints now (PHP 7+ only), but it was originally
* written for PHP 5 as well.
*
* 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(
int $length = 64,
string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
if ($length < 1) {
throw new \RangeException("Length must be a positive integer");
}
$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');
$c = random_str();
Демонстрація : https://3v4l.org/IMJGF (Ігноруйте відмови PHP 5; їй потрібен random_compat)