Comment serait-il possible de générer une chaîne aléatoire unique à l'aide de chiffres et de lettres à utiliser dans un lien de vérification? Comme lorsque vous créez un compte sur un site Web, et il vous envoie un e-mail avec un lien, et vous devez cliquer sur ce lien afin de vérifier votre compte ... ouais ... l'un d'eux.
Comment puis-je en générer un en utilisant PHP?
Mise à jour: Je me souviens juste de uniqid()
. C'est une fonction PHP qui génère un identifiant unique basé sur l'heure actuelle en microsecondes. Je pense que je vais l'utiliser.
php
string
random
uniqueidentifier
Andrew
la source
la source
Scott
la bonne réponse. Scott utilise le générateur de nombres psudo-aléatoires (CSPRNG) cryptographiquement sécurisé d'OpenSSL qui choisira la source d'entropie la plus sécurisée en fonction de votre plateforme.uniqid
sont pas sécurisés. Utilisez quelque chose commeRandom::alphanumericString($length)
ouRandom::alphanumericHumanString($length)
.Réponses:
Si vous n'avez pas besoin qu'il soit absolument unique au fil du temps:
md5(uniqid(rand(), true))
Sinon (étant donné que vous avez déjà déterminé une connexion unique pour votre utilisateur):
la source
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 à laopenssl_random_pseudo_bytes()
place pour générer des jetons sécurisés cryptographiquement.Une réponse rapide, courte et précise est:
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).
crypto_rand_secure($min, $max)
fonctionne en remplacement derand()
oumt_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:
la source
base64_encode
au lieu debin2hex
pour obtenir une chaîne plus courte avec un alphabet plus grand.Version orientée objet de la solution la plus votée
J'ai créé une solution orientée objet basée sur la réponse de Scott :
Usage
Alphabet personnalisé
Vous pouvez utiliser un alphabet personnalisé si nécessaire. Passez simplement une chaîne avec les caractères pris en charge au constructeur ou au setter:
Voici les échantillons de sortie
J'espère que cela aidera quelqu'un. À votre santé!
la source
$obj = new RandomStringGenerator;
mais quelle méthode dois-je appeler? Je vous remercie.generate
méthode comme dans l'exemple ci-dessus. Il suffit de lui passer un entier pour spécifier la longueur de la chaîne résultante.Custom Alphabet
pas. J'ai une sortie vide quand je fais écho. Quoi qu'il en soit, je ne sais même pas à quoi sert le 2ème exemple,Custom Alphabet
donc je pense que je reste avec le premier exemple. Merci.Je suis en retard mais je suis ici avec de bonnes données de recherche basées sur les fonctions fournies par la réponse de Scott . J'ai donc mis en place une gouttelette Digital Ocean juste pour ce test automatisé de 5 jours et stocké les chaînes uniques générées dans une base de données MySQL.
Pendant cette période de test, j'ai utilisé 5 longueurs différentes (5, 10, 15, 20, 50) et +/- 0,5 million d'enregistrements ont été insérés pour chaque longueur. Au cours de mon test, seule la longueur 5 a généré +/- 3 000 doublons sur 0,5 million et les longueurs restantes n'ont généré aucun doublon. Nous pouvons donc dire que si nous utilisons une longueur de 15 ou plus avec les fonctions de Scott, nous pouvons générer des chaînes uniques très fiables. Voici le tableau montrant mes données de recherche:
Mise à jour: j'ai créé une application Heroku simple en utilisant ces fonctions qui renvoie le jeton en tant que réponse JSON. L'application est accessible sur https://uniquestrings.herokuapp.com/api/token?length=15
J'espère que ça aide.
la source
Vous pouvez utiliser l'UUID (Universally Unique Identifier), il peut être utilisé à toutes fins, de la chaîne d'authentification de l'utilisateur à l'ID de transaction de paiement.
Un UUID est un nombre de 16 octets (128 bits). Dans sa forme canonique, un UUID est représenté par 32 chiffres hexadécimaux, affichés en cinq groupes séparés par des tirets, sous la forme 8-4-4-4-12 pour un total de 36 caractères (32 caractères alphanumériques et quatre tirets).
// appeler funtion
quelques exemples de sorties seront comme:
j'espère que cela aidera quelqu'un à l'avenir :)
la source
Cette fonction générera une clé aléatoire en utilisant des chiffres et des lettres:
Exemple de sortie:
la source
J'utilise ce one-liner:
où longueur est la longueur de la chaîne souhaitée (divisible par 4, sinon elle est arrondie au nombre divisible par 4 le plus proche)
la source
==
base64url_encode
peut être utilisé à la place, voir ici: php.net/manual/en/function.base64-encode.phpUtilisez le code ci-dessous pour générer le nombre aléatoire de 11 caractères ou modifiez le nombre selon vos besoins.
ou nous pouvons utiliser une fonction personnalisée pour générer le nombre aléatoire
la source
substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstvwxyz', 36)), 0, 11);
par exemple (en pseudo code)
la source
Voici le générateur d'identification unique ultime pour vous. fait par moi.
vous pouvez faire écho à n'importe quel «var» pour votre identifiant comme vous le souhaitez. mais $ mdun est mieux, vous pouvez remplacer md5 en sha1 pour un meilleur code mais ce sera très long dont vous n'aurez peut-être pas besoin.
Je vous remercie.
la source
Pour les chaînes vraiment aléatoires, vous pouvez utiliser
les sorties :
donc même si vous essayez de générer plusieurs fois la chaîne en même temps, vous obtiendrez une sortie différente.
la source
Lorsque vous essayez de générer un mot de passe aléatoire, vous essayez de:
Générez d'abord un ensemble d'octets aléatoires cryptographiquement sécurisé
La deuxième consiste à transformer ces octets aléatoires en une chaîne imprimable
Maintenant, il existe plusieurs façons de générer des octets aléatoires en php comme:
Ensuite, vous souhaitez transformer ces octets aléatoires en une chaîne imprimable:
Vous pouvez utiliser bin2hex :
ou base64_encode :
Cependant, notez que vous ne contrôlez pas la longueur de la chaîne si vous utilisez base64. Vous pouvez utiliser bin2hex pour ce faire, l'utilisation de 32 octets se transformera en une chaîne de 64 caractères . Mais cela ne fonctionnera ainsi que dans une chaîne MÊME .
Donc, fondamentalement, vous pouvez simplement faire :
la source
Voici ce que j'utilise:
la source
la source
Il s'agit d'une fonction simple qui vous permet de générer des chaînes aléatoires contenant des lettres et des chiffres (alphanumériques). Vous pouvez également limiter la longueur de la chaîne. Ces chaînes aléatoires peuvent être utilisées à diverses fins, notamment: code de référence, code promotionnel, code de coupon. La fonction repose sur les fonctions PHP suivantes: base_convert, sha1, uniqid, mt_rand
la source
après avoir lu les exemples précédents, j'ai trouvé ceci:
Je duplique 10 fois le tableau [0-9, AZ] et mélange les éléments, après avoir obtenu un point de départ aléatoire pour que substr () soit plus «créatif» :) vous pouvez ajouter [az] et d'autres éléments au tableau, dupliquer plus ou moins, soyez plus créatif que moi
la source
J'aime utiliser des clés de hachage lorsque je traite des liens de vérification. Je recommanderais d'utiliser le microtime et de hacher cela en utilisant MD5 car il ne devrait y avoir aucune raison pour que les clés soient les mêmes car il hache en fonction du microtime.
$key = md5(rand());
$key = md5(microtime());
la source
la fonction ci-dessus vous générera une chaîne aléatoire d'une longueur de 11 caractères.
la source
Si vous souhaitez générer une chaîne unique en PHP, essayez de suivre.
Dans ce,
uniqid()
- Il générera une chaîne unique. Cette fonction renvoie l'identificateur unique basé sur l'horodatage sous forme de chaîne.mt_rand()
- Générez un nombre aléatoire.md5()
- Il générera la chaîne de hachage.la source
Scott, oui tu es très écrit et bonne solution! Merci.
Je dois également générer un jeton API unique pour chaque utilisateur. Voici mon approche, j'ai utilisé les informations utilisateur (Userid et Username):
Veuillez jeter un coup d'œil et faites-moi savoir si je peux apporter des améliorations Merci
la source
Voici ce que j'utilise sur l'un de mes projets, il fonctionne très bien et il génère un JETON RANDOM UNIQUE :
Veuillez noter que j'ai multiplié l'horodatage par trois pour créer une confusion pour quiconque se demande peut-être comment ce jeton est généré;)
J'espère que ça aide :)
la source
Je pense que c'est la meilleure méthode à utiliser.
la source
nous pouvons utiliser ces deux lignes de code pour générer une chaîne unique ont testé environ 10000000 fois d'itération
la source
J'utilise toujours cette fonction pour générer une chaîne alphanumérique aléatoire personnalisée ... J'espère que cette aide.
Il génère par exemple: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g
Si vous voulez comparer avec une autre chaîne pour vous assurer qu'il s'agit d'une séquence unique, vous pouvez utiliser cette astuce ...
il génère deux chaînes uniques:
qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi
Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF
J'espère que c'est ce que vous cherchez ...
la source
Une solution simple consiste à convertir la base 64 en caractères alphanumériques en supprimant les caractères non alphanumériques.
Celui-ci utilise random_bytes () pour un résultat cryptographiquement sécurisé.
la source
Je pense que c'est une meilleure solution
la source
Je crois que le problème avec toutes les idées existantes est qu'elles sont probablement uniques, mais pas définitivement uniques (comme souligné dans la réponse de Dariusz Walczak à loletech). J'ai une solution qui est réellement unique. Cela nécessite que votre script ait une sorte de mémoire. Pour moi, c'est une base de données SQL. Vous pouvez également simplement écrire dans un fichier quelque part. Il existe deux implémentations:
Première méthode: avoir DEUX champs au lieu d'un qui fournissent l'unicité. Le premier champ est un numéro d'identification non aléatoire mais unique (le premier identifiant est 1, le second 2 ...). Si vous utilisez SQL, définissez simplement le champ ID avec la propriété AUTO_INCREMENT. Le deuxième champ n'est pas unique mais aléatoire. Cela peut être généré avec l'une des autres techniques que les gens ont déjà mentionnées. L'idée de Scott était bonne, mais md5 est pratique et probablement assez bonne pour la plupart des usages:
Deuxième méthode: Fondamentalement, la même idée, mais choisissez initialement un nombre maximum de chaînes qui seront jamais générées. Cela pourrait juste être un très grand nombre comme un billion. Faites ensuite la même chose, générez un ID, mais mettez-le à zéro afin que tous les ID aient le même nombre de chiffres. Ensuite, concaténez simplement l'ID avec la chaîne aléatoire. Il sera suffisamment aléatoire pour la plupart des utilisations, mais la section ID s'assurera qu'il est également unique.
la source
Vous pouvez utiliser ce code, j'espère qu'il vous sera utile.
Détails sur Générateur de code aléatoire en PHP
la source
Simplifier le code Scotts ci-dessus en supprimant les boucles inutiles, ce qui ralentit gravement et ne le rend pas plus sécurisé que d'appeler openssl_random_pseudo_bytes une seule fois
la source
openssl
n'est pas la cause de cela, c'est à cause du biais modulo dans votre déclaration de retour. 100 (plage) ne divise pas 255 (1 octet) également et provoque ces résultats. Mon plus gros problème avec votre réponse est que vous déclarez que la fonction est aussi sécurisée que l'utilisation d'une boucle, ce qui est faux. Votre implémentation de crypto_rand_secure n'est pas sécurisée cryptographiquement et est trompeuse.openssl
plus sécurisée, mais plus important encore, elle ne la rend pas moins sécurisée, cette réponse le fait. Le code ci-dessus prend un nombre aléatoire parfaitement bon et le modifie en le biaisant vers des nombres inférieurs. Si vous mettez un avertissement sur votre réponse indiquant qu'elle est plus rapide (en supprimant la boucle) mais qu'il ne s'agit pas d'un CSPRNG, cela résoudrait ce problème. S'il vous plaît, pour l'amour de la cryptographie, faites savoir aux utilisateurs que la sortie de cette fonction pourrait être biaisée et n'est pas une solution équivalente. La boucle n'est pas seulement là pour vous ennuyer.