Il existe de nombreuses réponses à cette question, mais aucune d'entre elles ne tire parti d'un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (CSPRNG).
La réponse simple, sûre et correcte consiste à utiliser RandomLib et à ne pas réinventer la roue.
Pour ceux d'entre vous qui insistent pour inventer votre propre solution, PHP 7.0.0 fournira random_int()
à cet effet; si vous êtes toujours sur PHP 5.x, nous avons écrit un polyfill PHP 5 pourrandom_int()
que vous puissiez utiliser la nouvelle API avant même de passer à PHP 7.
Générer en toute sécurité des nombres entiers aléatoires en PHP n'est pas une tâche triviale. Vous devriez toujours vérifier avec vos experts en cryptographie StackExchange résidents avant de déployer un algorithme local en production.
Avec un générateur d'entiers sécurisé en place, générer une chaîne aléatoire avec un CSPRNG est une promenade dans le parc.
Création d'une chaîne aléatoire et sécurisée
/**
* 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);
}
Utilisation :
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();
Démo : https://3v4l.org/IMJGF (Ignorez les échecs de PHP 5; il a besoin de random_compat)