Je cherchais juste à résoudre ce même problème, mais je veux aussi que ma fonction crée un jeton qui peut également être utilisé pour la récupération de mot de passe. Cela signifie que je dois limiter la capacité du jeton à être deviné. Parce que uniqid
est basé sur l'heure, et selon php.net "la valeur de retour est peu différente de microtime ()", uniqid
ne répond pas aux critères. PHP recommande d'utiliser à la openssl_random_pseudo_bytes()
place pour générer des jetons sécurisés cryptographiquement.
Une réponse rapide, courte et précise est:
bin2hex(openssl_random_pseudo_bytes($bytes))
qui va générer une chaîne aléatoire de caractères alphanumériques de longueur = $ octets * 2. Malheureusement, cela n'a qu'un alphabet [a-f][0-9]
, mais cela fonctionne.
Ci-dessous se trouve la fonction la plus puissante que j'ai pu faire et qui réponde aux critères (Ceci est une version implémentée de la réponse d'Erik).
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)
fonctionne en remplacement de rand()
ou mt_rand
. Il utilise openssl_random_pseudo_bytes pour aider à créer un nombre aléatoire entre $ min et $ max.
getToken($length)
crée un alphabet à utiliser dans le jeton, puis crée une chaîne de longueur $length
.
EDIT: j'ai négligé de citer la source - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): Avec la sortie de PHP7, la bibliothèque standard dispose désormais de deux nouvelles fonctions qui peuvent remplacer / améliorer / simplifier la fonction crypto_rand_secure ci-dessus. random_bytes($length)
etrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Exemple:
function getToken($length){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet);
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[random_int(0, $max-1)];
}
return $token;
}