Wie wäre es möglich, eine zufällige, eindeutige Zeichenfolge mit Zahlen und Buchstaben zur Verwendung in einem Überprüfungslink zu generieren? Zum Beispiel, wenn Sie ein Konto auf einer Website erstellen und eine E-Mail mit einem Link erhalten und auf diesen Link klicken müssen, um Ihr Konto zu verifizieren ... ja ... eines davon.
Wie kann ich eine davon mit PHP generieren?
Update: Gerade erinnert uniqid()
. Es ist eine PHP-Funktion, die basierend auf der aktuellen Zeit in Mikrosekunden eine eindeutige Kennung generiert. Ich denke, ich werde das nutzen.
php
string
random
uniqueidentifier
Andrew
quelle
quelle
Scott
die richtige Antwort wählen . Scott verwendet den kryptografisch sicheren Psudo-Zufallszahlengenerator (CSPRNG) von OpenSSL, der basierend auf Ihrer Plattform die sicherste Entropiequelle auswählt.uniqid
sind unsicher. Verwenden Sie so etwas wieRandom::alphanumericString($length)
oderRandom::alphanumericHumanString($length)
.Antworten:
Wenn Sie es nicht brauchen, um im Laufe der Zeit absolut einzigartig zu sein:
md5(uniqid(rand(), true))
Andernfalls (vorausgesetzt, Sie haben bereits ein eindeutiges Login für Ihren Benutzer festgelegt):
quelle
Ich habe nur untersucht, wie ich das gleiche Problem lösen kann, aber ich möchte auch, dass meine Funktion ein Token erstellt, das auch zum Abrufen von Passwörtern verwendet werden kann. Dies bedeutet, dass ich die Fähigkeit des zu erratenden Tokens einschränken muss. Da
uniqid
basierend auf der Zeit und laut php.net "der Rückgabewert sich kaum von microtime () unterscheidet",uniqid
erfüllt er die Kriterien nicht. PHP empfiehlt,openssl_random_pseudo_bytes()
stattdessen kryptografisch sichere Token zu generieren.Eine schnelle, kurze und präzise Antwort lautet:
Dadurch wird eine zufällige Zeichenfolge mit alphanumerischen Zeichen der Länge = $ bytes * 2 generiert. Leider hat dies nur ein Alphabet von
[a-f][0-9]
, aber es funktioniert.Unten ist die stärkste Funktion, die ich machen könnte, die die Kriterien erfüllt (Dies ist eine implementierte Version von Eriks Antwort).
crypto_rand_secure($min, $max)
funktioniert als Ersatz fürrand()
odermt_rand
. Es verwendet openssl_random_pseudo_bytes, um eine Zufallszahl zwischen $ min und $ max zu erstellen.getToken($length)
Erstellt ein Alphabet zur Verwendung innerhalb des Tokens und erstellt dann eine Zeichenfolge mit der Länge$length
.EDIT: Ich habe es versäumt, die Quelle zu zitieren - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): Mit der Veröffentlichung von PHP7 verfügt die Standardbibliothek nun über zwei neue Funktionen, die die oben genannte Funktion crypto_rand_secure ersetzen / verbessern / vereinfachen können.
random_bytes($length)
undrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Beispiel:
quelle
base64_encode
anstelle von verwendenbin2hex
, um eine kürzere Zeichenfolge mit einem größeren Alphabet zu erhalten.Objektorientierte Version der am besten bewerteten Lösung
Ich habe eine objektorientierte Lösung basierend auf Scotts Antwort erstellt:
Verwendungszweck
Benutzerdefiniertes Alphabet
Bei Bedarf können Sie ein benutzerdefiniertes Alphabet verwenden. Übergeben Sie einfach eine Zeichenfolge mit unterstützten Zeichen an den Konstruktor oder Setter:
Hier sind die Ausgabebeispiele
Ich hoffe es wird jemandem helfen. Prost!
quelle
$obj = new RandomStringGenerator;
aber welche Methode soll ich aufrufen? Vielen Dank.generate
Methode wie im obigen Beispiel aufrufen . Übergeben Sie einfach eine Ganzzahl, um die Länge der resultierenden Zeichenfolge anzugeben.Custom Alphabet
aber nicht getan. Ich habe eine leere Ausgabe, wenn ich echo. Wie auch immer, ich bin mir nicht mal sicher, was das zweite Beispiel nützt,Custom Alphabet
also denke ich, ich bleibe einfach beim ersten Beispiel. Vielen Dank.Ich bin spät dran, aber ich bin hier mit einigen guten Forschungsdaten, die auf den Funktionen von Scotts Antwort basieren . Deshalb habe ich ein Digital Ocean-Tröpfchen nur für diesen 5-tägigen automatisierten Test eingerichtet und die generierten eindeutigen Zeichenfolgen in einer MySQL-Datenbank gespeichert.
Während dieses Testzeitraums habe ich 5 verschiedene Längen (5, 10, 15, 20, 50) verwendet und für jede Länge wurden +/- 0,5 Millionen Datensätze eingefügt. Während meines Tests erzeugte nur die Länge 5 +/- 3K-Duplikate von 0,5 Millionen und die verbleibenden Längen erzeugten keine Duplikate. Wir können also sagen, dass wir, wenn wir mit Scotts Funktionen eine Länge von 15 oder mehr verwenden, hochzuverlässige eindeutige Zeichenfolgen generieren können. Hier ist die Tabelle mit meinen Forschungsdaten:
Update: Ich habe mit diesen Funktionen eine einfache Heroku-App erstellt, die das Token als JSON-Antwort zurückgibt. Auf die App kann unter https://uniquestrings.herokuapp.com/api/token?length=15 zugegriffen werden
Ich hoffe das hilft.
quelle
Sie können die UUID (Universally Unique Identifier) verwenden. Sie kann für jeden Zweck verwendet werden, von der Benutzerauthentifizierungszeichenfolge bis zur Zahlungsvorgangs-ID.
Eine UUID ist eine 128-Bit-Zahl mit 16 Oktetten. In seiner kanonischen Form wird eine UUID durch 32 hexadezimale Ziffern dargestellt, die in fünf durch Bindestriche getrennten Gruppen in der Form 8-4-4-4-12 für insgesamt 36 Zeichen (32 alphanumerische Zeichen und vier Bindestriche) angezeigt werden.
// Funktion aufrufen
Einige Beispielausgaben sind wie folgt:
hoffe es hilft jemandem in der Zukunft :)
quelle
Diese Funktion generiert einen Zufallsschlüssel mit Zahlen und Buchstaben:
Beispielausgabe:
quelle
Ich benutze diesen Einzeiler:
Dabei ist Länge die Länge der gewünschten Zeichenfolge (teilbar durch 4, andernfalls wird sie auf die nächste durch 4 teilbare Zahl abgerundet.)
quelle
==
base64url_encode
kann stattdessen verwendet werden, siehe hier: php.net/manual/en/function.base64-encode.phpVerwenden Sie den folgenden Code, um die Zufallszahl von 11 Zeichen zu generieren oder die Zahl gemäß Ihren Anforderungen zu ändern.
oder wir können eine benutzerdefinierte Funktion verwenden, um die Zufallszahl zu generieren
quelle
substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstvwxyz', 36)), 0, 11);
zB (im Pseudocode)
quelle
Hier ist der ultimative einzigartige ID-Generator für Sie. von mir gemacht.
Sie können jede 'var' für Ihre ID nach Belieben wiedergeben. aber $ mdun ist besser, Sie können md5 durch sha1 ersetzen, um besseren Code zu erhalten, aber das wird sehr lang sein, was Sie vielleicht nicht brauchen.
Vielen Dank.
quelle
Für wirklich zufällige Zeichenfolgen können Sie verwenden
Ausgänge:
Selbst wenn Sie versuchen, einen String mehrmals genau zur gleichen Zeit zu generieren, erhalten Sie unterschiedliche Ausgaben.
quelle
Wenn Sie versuchen, ein zufälliges Passwort zu generieren, versuchen Sie:
Generieren Sie zunächst einen kryptografisch sicheren Satz zufälliger Bytes
Zweitens werden diese zufälligen Bytes in eine druckbare Zeichenfolge umgewandelt
Jetzt gibt es mehrere Möglichkeiten, zufällige Bytes in PHP zu generieren, wie:
Dann möchten Sie diese zufälligen Bytes in eine druckbare Zeichenfolge umwandeln:
Sie können bin2hex verwenden :
oder base64_encode :
Beachten Sie jedoch, dass Sie die Länge der Zeichenfolge nicht steuern, wenn Sie base64 verwenden. Sie können dazu bin2hex verwenden. Die Verwendung von 32 Bytes wird zu einer Zeichenfolge mit 64 Zeichen . Aber es wird nur so in einer EVEN- Zeichenfolge funktionieren .
Im Grunde können Sie also einfach Folgendes tun :
quelle
Folgendes benutze ich:
quelle
quelle
Dies ist eine einfache Funktion, mit der Sie zufällige Zeichenfolgen mit Buchstaben und Zahlen (alphanumerisch) generieren können. Sie können auch die Zeichenfolgenlänge begrenzen. Diese zufälligen Zeichenfolgen können für verschiedene Zwecke verwendet werden, einschließlich: Empfehlungscode, Aktionscode, Gutscheincode. Die Funktion basiert auf folgenden PHP-Funktionen: base_convert, sha1, uniqid, mt_rand
quelle
Nachdem ich die vorherigen Beispiele gelesen hatte, kam ich auf Folgendes:
Ich dupliziere das Array 10-mal [0-9, AZ] und mische die Elemente, nachdem ich einen zufälligen Startpunkt für substr () erhalten habe, um kreativer zu sein :) Sie können dem Array [az] und andere Elemente hinzufügen, duplizieren Sei mehr oder weniger kreativer als ich
quelle
Ich verwende gerne Hash-Schlüssel, wenn ich Verifizierungslinks verarbeite. Ich würde empfehlen, die Mikrozeit zu verwenden und MD5 zu verwenden, da es keinen Grund geben sollte, warum die Schlüssel gleich sein sollten, da sie auf der Mikrozeit basieren.
$key = md5(rand());
$key = md5(microtime());
quelle
Die obige Funktion generiert eine zufällige Zeichenfolge mit einer Länge von 11 Zeichen.
quelle
Wenn Sie eine eindeutige Zeichenfolge in PHP generieren möchten, versuchen Sie Folgendes.
In diesem,
uniqid()
- Es wird eine eindeutige Zeichenfolge generiert. Diese Funktion gibt einen auf einem Zeitstempel basierenden eindeutigen Bezeichner als Zeichenfolge zurück.mt_rand()
- Zufallszahl generieren.md5()
- Es wird die Hash-Zeichenfolge generiert.quelle
Scott, ja du bist sehr schreibend und gute Lösung! Vielen Dank.
Ich muss außerdem für jeden Benutzer ein eindeutiges API-Token generieren. Im Folgenden ist mein Ansatz, ich habe Benutzerinformationen (Benutzer-ID und Benutzername) verwendet:
Bitte schauen Sie und lassen Sie mich wissen, ob ich Verbesserungen vornehmen kann. Vielen Dank
quelle
Folgendes verwende ich für eines meiner Projekte: Es funktioniert hervorragend und generiert ein EINZIGARTIGES ZUFÄLLIGES TOKEN :
Bitte beachten Sie, dass ich den Zeitstempel mit drei multipliziert habe, um Verwirrung zu stiften für jeden Benutzer, der sich fragt, wie dieses Token generiert wird;)
Ich hoffe, es hilft :)
quelle
Ich denke, dies ist die beste Methode.
quelle
Wir können diese beiden Codezeilen verwenden, um eine eindeutige Zeichenfolge zu generieren, die etwa 10000000 Mal iteriert wurde
quelle
Ich benutze diese Funktion immer, um eine benutzerdefinierte zufällige alphanumerische Zeichenfolge zu generieren ... Hoffe diese Hilfe.
Es generiert zum Beispiel: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g
Wenn Sie mit einer anderen Zeichenfolge vergleichen möchten, um sicherzustellen, dass es sich um eine eindeutige Sequenz handelt, können Sie diesen Trick verwenden ...
Es werden zwei eindeutige Zeichenfolgen generiert:
qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi
Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF
Hoffe das ist was du suchst ...
quelle
Eine einfache Lösung besteht darin, die Basis 64 in alphanumerische Zeichen umzuwandeln, indem die nicht alphanumerischen Zeichen verworfen werden.
Dieser verwendet random_bytes () für ein kryptografisch sicheres Ergebnis.
quelle
Ich denke, das ist eine bessere Lösung
quelle
Ich glaube, das Problem bei allen vorhandenen Ideen ist, dass sie wahrscheinlich einzigartig, aber nicht definitiv einzigartig sind (wie in Dariusz Walczaks Antwort auf Loletech ausgeführt). Ich habe eine Lösung, die eigentlich einzigartig ist. Es erfordert, dass Ihr Skript über eine Art Speicher verfügt. Für mich ist dies eine SQL-Datenbank. Sie können auch einfach irgendwo in eine Datei schreiben. Es gibt zwei Implementierungen:
Erste Methode: Haben Sie ZWEI Felder anstelle von 1, die die Eindeutigkeit gewährleisten. Das erste Feld ist eine ID-Nummer, die nicht zufällig, sondern eindeutig ist (Die erste ID ist 1, die zweite 2 ...). Wenn Sie SQL verwenden, definieren Sie einfach das ID-Feld mit der Eigenschaft AUTO_INCREMENT. Das zweite Feld ist nicht eindeutig, sondern zufällig. Dies kann mit jeder anderen Technik erzeugt werden, die bereits erwähnt wurde. Scotts Idee war gut, aber md5 ist praktisch und wahrscheinlich für die meisten Zwecke gut genug:
Zweite Methode: Grundsätzlich die gleiche Idee, aber zunächst eine maximale Anzahl von Zeichenfolgen auswählen, die jemals generiert werden. Dies könnte nur eine wirklich große Zahl wie eine Billion sein. Machen Sie dann dasselbe, generieren Sie eine ID, aber füllen Sie sie mit Null auf, sodass alle IDs die gleiche Anzahl von Ziffern haben. Dann verketten Sie einfach die ID mit der zufälligen Zeichenfolge. Für die meisten Zwecke ist es zufällig genug, aber der ID-Abschnitt stellt sicher, dass es auch eindeutig ist.
quelle
Sie können diesen Code verwenden, ich hoffe, er wird für Sie hilfreich sein.
Details zum Zufallscodegenerator in PHP
quelle
Vereinfachung des obigen Scotts-Codes durch Entfernen unnötiger Schleifen, die sich stark verlangsamen und nicht sicherer machen als das einmalige Aufrufen von openssl_random_pseudo_bytes
quelle
openssl
verursacht dies nicht, sondern liegt an der Modulo-Verzerrung in Ihrer return-Anweisung. 100 (Bereich) teilt 255 (1 Byte) nicht gleichmäßig und verursacht diese Ergebnisse. Mein größtes Problem mit Ihrer Antwort ist, dass Sie angeben, dass die Funktion so sicher ist wie die Verwendung einer Schleife, was falsch ist. Ihre Implementierung von crypto_rand_secure ist nicht kryptografisch sicher und irreführend.openssl
sicherer ist, aber was noch wichtiger ist, sie macht sie nicht weniger sicher, diese Antwort tut es. Der obige Code nimmt eine vollkommen gute Zufallszahl und zerlegt sie, indem er sie auf niedrigere Zahlen ausrichtet. Wenn Sie Ihrer Antwort einen Haftungsausschluss hinzufügen, der besagt, dass sie schneller ist (indem Sie die Schleife entfernen), es sich jedoch nicht um eine CSPRNG handelt, wird dieses Problem behoben. Bitte lassen Sie die Benutzer aus Liebe zur Krypto wissen, dass die Ausgabe dieser Funktion verzerrt sein kann und keine gleichwertige Lösung darstellt. Die Schleife ist nicht nur da, um Sie zu ärgern.