J'essaie de créer une chaîne aléatoire en PHP, et je n'obtiens absolument aucune sortie avec ceci:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
Qu'est-ce que je fais mal?
strlen($characters)
=>strlen($characters) - 1
- la longueur de la chaîne commence par 1Réponses:
Pour répondre spécifiquement à cette question, deux problèmes:
$randstring
n'est pas dans la portée lorsque vous l'écho.Voici un extrait de code avec les corrections:
Sortez la chaîne aléatoire avec l'appel ci-dessous:
la source
substr(str_shuffle(MD5(microtime())), 0, 10);
?rand()
pourmt_rand()
. J'ai utilisé votre méthode et vécu une tonne de collisions avec des noms.Encore une façon.
MISE À JOUR (maintenant cela génère n'importe quelle longueur de chaîne):
C'est ça. :)
la source
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
Utilisation :
Démo : https://3v4l.org/IMJGF (Ignorez les échecs de PHP 5; il a besoin de random_compat)
la source
$keyspace = str_shuffle($keyspace );
pour plus de sécuritérandom_int()
au lieu derand()
oumt_rand()
n'ajoute aucune complexité pour le développeur. En même temps, cela leur donne une plus grande sécurité. Les personnes qui viennent sur StackOverflow à la recherche de solutions rapides peuvent ne pas savoir si la chose qu'elles construisent doit être sécurisée ou non. Si nous leur donnons des réponses sécurisées par défaut, ils créent un Internet plus sécurisé même si, de leur point de vue, c'est totalement accidentel. Pourquoi vous opposeriez-vous à cet objectif est un mystère pour moi.Cela crée une chaîne hexadécimale longue de 20 caractères:
En PHP 7 ( random_bytes () ):
la source
openssl_random_pseudo_bytes()
n'avez pas utilisé d'algorithme cryptographiquement puissant jusqu'à php 5.6. Bogueopenssl_random_pseudo_bytes()
vous n'obtiendrez rien en retour. Notez également que lors de l'utilisationbin2hex(openssl_random_pseudo_bytes($length / 2))
puisque vous travaillez avec des entiers, il supprimera automatiquement le modulo et utilisera le prochain plus petit multiple de 2. Ainsi,$length = 19
produira une chaîne de longueur 18.fgets($fp, 1024)
et chaque éditeur de fichiers qui a des problèmes avec des lignes très longues:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }
Set$split
pournull
s'il doit renvoyer une seule ligne. Par cela, vous pouvez l'utiliser pour les deux cas.$string = substr(base64_encode(random_bytes($size)), 0, $size);
@tasmaniski: votre réponse a fonctionné pour moi. J'ai eu le même problème, et je le proposerais à ceux qui recherchent toujours la même réponse. Le voici de @tasmaniski:
Voici une vidéo sur YouTube nous montrant comment créer un nombre aléatoire
la source
md5
que la limite est de 30 caractères et toujours les caractères en minuscules.md5(rand())
ne propose que 2 ^ 32 valeurs possibles. Cela signifie qu'après, en moyenne, 2 ^ 16 chaînes aléatoires, vous vous attendez à ce qu'une répétition.Selon votre application (je voulais générer des mots de passe), vous pouvez utiliser
Étant base64, ils peuvent contenir
=
ou-
aussi bien que les caractères demandés. Vous pouvez générer une chaîne plus longue, puis la filtrer et la couper pour la supprimer.openssl_random_pseudo_bytes
semble être le moyen recommandé pour générer un nombre aléatoire approprié en php. Pourquoirand
n'utilise pas/dev/random
je ne sais pas.la source
openssl_random_pseudo_bytes()
est portable.Voici une simple ligne qui génère une vraie chaîne aléatoire sans aucune boucle de niveau de script ni utilisation de bibliothèques OpenSSL.
Pour le décomposer afin que les paramètres soient clairs
Cette méthode fonctionne en répétant au hasard la liste des caractères, puis mélange la chaîne combinée et renvoie le nombre de caractères spécifié.
Vous pouvez encore randomiser cela, en randomisant la longueur de la chaîne retournée, en la remplaçant
$chrRandomLength
parmt_rand(8, 15)
(pour une chaîne aléatoire entre 8 et 15 caractères).la source
$chrRepeatMax
et$chrRepeatMin
) - donc une chaîne de 10 caractères, pourrait (peu probable, mais possible), être "aaaaaaaaaaa".Tada!
la source
sha1
que la limite est de 40 caractères et toujours les caractères en minuscules.rant()
être aléatoire n'a pas d'importance lorsque sha n'est pas réparti également. Si vous sélectionnez au hasard dans une distribution inégale, vous obtenez exactement la même distribution inégale. Ce n'est pas le caractère aléatoire du "niveau crypto" que je souligne, si c'était le cas, vous ne devriez pas non plus l'utiliserrand()
. Il faut un effort minimal pour extraire une distribution uniforme comme dans la réponse acceptée et c'est aussi aléatoire que rand () qui est raisonnablement.Une meilleure façon de mettre en œuvre cette fonction est:
mt_rand
est plus aléatoire selon ceci et cela en PHP 7. Larand
fonction est un alias demt_rand
.la source
mt_rand
ne génère pas de valeurs cryptographiquement sécurisées. Pour cela, vous devez utiliser PHP7random_int
ourandom_bytes
.$randstring
dans la portée de la fonction n'est pas la même que celle où vous l'appelez. Vous devez affecter la valeur de retour à une variable.Ou faites simplement écho à la valeur de retour:
De plus, dans votre fonction, vous avez une petite erreur. Dans la boucle for, vous devez utiliser
.=
pour que chaque caractère soit ajouté à la chaîne. En l'utilisant,=
vous l'écrasez avec chaque nouveau caractère au lieu de l'ajouter.la source
Tout d'abord, vous définissez l'alphabet que vous souhaitez utiliser:
Ensuite, utilisez
openssl_random_pseudo_bytes()
pour générer des données aléatoires appropriées:Enfin, vous utilisez ces données aléatoires pour créer le mot de passe. Étant donné que chaque caractère
$random
peut êtrechr(0)
jusqu'àchr(255)
, le code utilise le reste après la division de sa valeur ordinale avec$alphabet_length
pour s'assurer que seuls les caractères de l'alphabet sont sélectionnés (notez que cela faussera le caractère aléatoire):Alternativement, et généralement mieux, utilisez RandomLib et SecurityLib :
la source
%
produira une sortie biaisée. Cependant, fort +1 pour RandomLib. Ne réinventez pas la roue.Méthodes courtes ..
Voici la méthode la plus courte pour générer la chaîne aléatoire
la source
J'y ai testé les performances des fonctions les plus populaires, le temps nécessaire pour générer 1'000'000 chaînes de 32 symboles sur ma box est:
Veuillez noter qu'il n'est pas important de savoir combien de temps il a réellement duré, mais lequel est plus lent et lequel est plus rapide afin que vous puissiez sélectionner en fonction de vos besoins, y compris la préparation à la cryptographie, etc.
substr () autour de MD5 a été ajouté par souci de précision si vous avez besoin d'une chaîne de moins de 32 symboles.
Par souci de réponse: la chaîne n'a pas été concaténée mais écrasée et le résultat de la fonction n'a pas été stocké.
la source
PHP 7+ Générez des octets aléatoires cryptographiquement sécurisés à l'aide de la fonction random_bytes .
Sortie possible
PHP 5.3+ Générez des octets pseudo-aléatoires en utilisant la fonction openssl_random_pseudo_bytes .
Sortie possible
Le meilleur cas d'utilisation pourrait être
Sortie possible
la source
Un moyen très rapide est de faire quelque chose comme:
Cela générera une chaîne aléatoire d'une longueur de 10 caractères. Bien sûr, certains pourraient dire que c'est un peu plus lourd du côté du calcul, mais de nos jours les processeurs sont optimisés pour exécuter l'algorithme md5 ou sha256 très rapidement. Et bien sûr, si la
rand()
fonction renvoie la même valeur, le résultat sera le même, avec 1/32767 chance d'être le même. Si la sécurité est le problème, passez simplementrand()
àmt_rand()
la source
la source
Celui-ci a été tiré de sources d'administrateur :
Administrateur , outil de gestion de base de données écrit en PHP.
la source
Fonction d'aide du framework Laravel 5
la source
Source sur http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/
la source
La version modifiée de la fonction fonctionne très bien, mais j'ai trouvé un seul problème: vous avez utilisé le mauvais caractère pour entourer les caractères $, de sorte que le caractère 'fait parfois partie de la chaîne aléatoire qui est générée.
Pour résoudre ce problème, modifiez:
à:
De cette façon, seuls les caractères inclus sont utilisés et le caractère 'ne fera jamais partie de la chaîne aléatoire générée.
la source
Un autre à une ligne, qui génère une chaîne aléatoire de 10 caractères avec des lettres et des chiffres. Il créera un tableau avec
range
(ajustez le deuxième paramètre pour définir la taille), boucle sur ce tableau et attribue un caractère ASCII aléatoire (plage 0-9 ou az), puis implose le tableau pour obtenir une chaîne.Remarque: cela ne fonctionne qu'en PHP 5.3 et versions ultérieures
la source
rand(0, 57-48+122-97)<57-48?...:...
? :)Bon mot.
Il est rapide pour les énormes cordes avec un certain caractère unique.
la source
md5(rand())
est un moyen horriblement peu sûr de générer un nombre aléatoire.Depuis php7, il y a les fonctions random_bytes. https://www.php.net/manual/ru/function.random-bytes.php Vous pouvez donc générer une chaîne aléatoire comme celle-ci
la source
J'ai aimé le dernier commentaire qui a utilisé openssl_random_pseudo_bytes, mais ce n'était pas une solution pour moi car je devais encore supprimer les caractères que je ne voulais pas, et je n'ai pas pu obtenir une chaîne de longueur définie. Voici ma solution ...
la source
la source
Voici ma solution simple en une ligne pour générer un mot de passe aléatoire convivial, excluant les caractères qui se ressemblent tels que "1" et "l", "O" et "0", etc ... ici, c'est 5 caractères mais vous pouvez facilement changez-le bien sûr:
la source
Voici une autre solution.
PS. J'utilise PHP 7.2 sur Ubuntu.
la source
Une autre façon de générer une chaîne aléatoire en PHP est:
la source
Voici comment je le fais pour obtenir une véritable clé aléatoire unique:
Vous pouvez utiliser time () car il s'agit d'un horodatage Unix et est toujours unique par rapport aux autres aléatoires mentionnés ci-dessus. Vous pouvez ensuite générer la somme md5 de cela et prendre la longueur souhaitée dont vous avez besoin à partir du MD5 généré chaîne . Dans ce cas, j'utilise 10 caractères et je pourrais utiliser une chaîne plus longue si je veux la rendre plus unique.
J'espère que ça aide.
la source
time()
est loin d'être unique: il retournera la même valeur encore et encore jusqu'à la fin de la seconde actuelle. Ce qui fournit vraiment un peu d'aléatoire ici, c'est questr_shuffle()
le reste du code ne réduit que l'échantillon pour sélectionner les caractères.time()
(ce n'est qu'un horodatage), c'est une faible source d'aléatoire.One-liner paramétré utilisant uniquement des fonctions natives PHP , fonctionnant depuis PHP 5.1.0
la source