Ich versuche, eine zufällige Zeichenfolge in PHP zu erstellen, und ich erhalte damit absolut keine Ausgabe:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
Was mache ich falsch?
strlen($characters)
=>strlen($characters) - 1
- Stringlänge beginnt mit 1Antworten:
Um diese Frage speziell zu beantworten, zwei Probleme:
$randstring
ist nicht im Geltungsbereich, wenn Sie es wiederholen.Hier ist ein Code-Snippet mit den Korrekturen:
Geben Sie die zufällige Zeichenfolge mit dem folgenden Aufruf aus:
quelle
substr(str_shuffle(MD5(microtime())), 0, 10);
?rand()
zumt_rand()
. Ich habe Ihre Methode angewendet und eine Menge Kollisionen mit Namen erlebt .Noch ein Weg.
AKTUALISIERT (dies erzeugt jetzt eine beliebige Länge der Zeichenfolge):
Das ist es. :) :)
quelle
Es gibt viele Antworten auf diese Frage, aber keine davon nutzt einen kryptografisch sicheren Pseudozufallszahlengenerator (CSPRNG).
Die einfache, sichere und richtige Antwort ist, RandomLib zu verwenden und das Rad nicht neu zu erfinden.
Für diejenigen unter Ihnen, die darauf bestehen, Ihre eigene Lösung zu erfinden, bietet PHP 7.0.0
random_int()
diesen Zweck. Wenn Sie noch mit PHP 5.x arbeiten, haben wir eine PHP 5-Polyfüllung für geschrieben,random_int()
damit Sie die neue API verwenden können, noch bevor Sie auf PHP 7 aktualisieren.Das sichere Generieren zufälliger Ganzzahlen in PHP ist keine triviale Aufgabe. Sie sollten sich immer an Ihre ansässigen StackExchange-Kryptografieexperten wenden, bevor Sie einen selbst entwickelten Algorithmus in der Produktion bereitstellen.
Mit einem sicheren Integer-Generator ist das Generieren einer zufälligen Zeichenfolge mit einem CSPRNG ein Spaziergang im Park.
Erstellen einer sicheren, zufälligen Zeichenfolge
Verwendung :
Demo : https://3v4l.org/IMJGF (Ignoriere die PHP 5-Fehler; es wird random_compat benötigt)
quelle
$keyspace = str_shuffle($keyspace );
für mehr Sicherheit hinzufügenrandom_int()
anstelle vonrand()
odermt_rand()
fügt dem Entwickler keine Komplexität hinzu. Gleichzeitig gibt es ihnen mehr Sicherheit. Leute, die zu StackOverflow kommen und nach schnellen Lösungen suchen, wissen möglicherweise nicht, ob das, was sie bauen, sicher sein muss oder nicht. Wenn wir ihnen standardmäßig sichere Antworten geben, schaffen sie ein sichereres Internet, auch wenn es aus ihrer Sicht völlig zufällig ist. Warum Sie sich diesem Ziel widersetzen würden, ist mir ein Rätsel.Dadurch wird eine 20 Zeichen lange hexadezimale Zeichenfolge erstellt:
In PHP 7 ( random_bytes () ):
quelle
openssl_random_pseudo_bytes()
bis PHP 5.6 kein kryptografisch starker Algorithmus verwendet wurde. Verwandte Fehler: bugs.php.net/bug.php?id=70014openssl_random_pseudo_bytes()
Sie übergeben, erhalten Sie nichts zurück. Beachtenbin2hex(openssl_random_pseudo_bytes($length / 2))
Sie außerdem, dass bei der Verwendung, da Sie mit Ganzzahlen arbeiten, das Modulo automatisch entfernt wird und das nächstniedrigere Vielfache von 2 verwendet wird. So$length = 19
wird eine Zeichenfolge mit der Länge 18 erzeugt.fgets($fp, 1024)
und für jeden Datei-Editor, der Probleme mit sehr langen Zeilen hat:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }
Legen Sie fest$split
,null
ob ein Einzeiler zurückgegeben werden soll. Auf diese Weise können Sie es für beide Fälle verwenden.$string = substr(base64_encode(random_bytes($size)), 0, $size);
@ Tasmaniski: Ihre Antwort hat bei mir funktioniert. Ich hatte das gleiche Problem und würde es denen empfehlen, die jemals nach der gleichen Antwort suchen. Hier ist es von @tasmaniski:
Hier ist ein Youtube-Video, das uns zeigt, wie man eine Zufallszahl erstellt
quelle
md5
dass dies zu einer Beschränkung auf 30 Zeichen und immer zu Kleinbuchstaben führt.md5(rand())
bietet nur 2 ^ 32 mögliche Werte. Dies bedeutet, dass Sie nach durchschnittlich 2 ^ 16 zufälligen Zeichenfolgen eine Wiederholung erwarten.Abhängig von Ihrer Anwendung (ich wollte Passwörter generieren) können Sie verwenden
Als base64 können sie
=
oder enthalten-
sowie die angeforderten Zeichen enthalten. Sie können eine längere Zeichenfolge generieren, diese dann filtern und zuschneiden, um diese zu entfernen.openssl_random_pseudo_bytes
scheint der empfohlene Weg zu sein, um eine richtige Zufallszahl in PHP zu generieren. Warumrand
nicht verwendet/dev/random
, weiß ich nicht.quelle
openssl_random_pseudo_bytes()
ist tragbar.Hier ist ein einfacher Einzeiler, der eine echte Zufallszeichenfolge ohne Schleifen auf Skriptebene oder Verwendung von OpenSSL-Bibliotheken generiert.
Um es aufzuschlüsseln, damit die Parameter klar sind
Diese Methode wiederholt die Zeichenliste nach dem Zufallsprinzip, mischt dann die kombinierte Zeichenfolge und gibt die angegebene Anzahl von Zeichen zurück.
Sie können dies weiter randomisieren, indem Sie die Länge der zurückgegebenen Zeichenfolge randomisieren und
$chrRandomLength
durchmt_rand(8, 15)
(für eine zufällige Zeichenfolge zwischen 8 und 15 Zeichen) ersetzen .quelle
$chrRepeatMax
und$chrRepeatMin
). Eine Zeichenfolge mit 10 Zeichen kann also (unwahrscheinlich, aber möglich) "aaaaaaaaa" sein.Tada!
quelle
sha1
dass dies zu einer Beschränkung auf 40 Zeichen und immer zu Kleinbuchstaben führt.rant()
zufällig zu sein spielt keine Rolle, wenn sha nicht gleichmäßig verteilt ist. Wenn Sie zufällig aus einer ungleichmäßigen Verteilung auswählen, erhalten Sie genau die gleiche ungleichmäßige Verteilung. Es ist keine Zufälligkeit auf "Krypto-Ebene", die ich hervorhole. Wenn dies der Fall wäre, sollten Sie sie auch nicht verwendenrand()
. Es erfordert nur minimalen Aufwand, aus einer gleichmäßigen Verteilung wie in der akzeptierten Antwort zu pflücken, und es ist so zufällig wie rand (), was vernünftigerweise so ist.Eine bessere Möglichkeit, diese Funktion zu implementieren, ist:
mt_rand
nach mehr zufällig dies und dies in PHP 7. Dierand
Funktion ein Alias istmt_rand
.quelle
mt_rand
Generiert keine kryptografisch sicheren Werte. Dafür sollten Sie PHP7random_int
oder verwendenrandom_bytes
.$randstring
im Funktionsumfang ist nicht derselbe wie der Bereich, in dem Sie ihn aufrufen. Sie müssen den Rückgabewert einer Variablen zuweisen.Oder geben Sie den Rückgabewert direkt wieder:
Auch in Ihrer Funktion haben Sie einen kleinen Fehler. Innerhalb der for-Schleife müssen Sie verwenden,
.=
damit jedes Zeichen an die Zeichenfolge angehängt wird. Wenn=
Sie verwenden, überschreiben Sie es mit jedem neuen Zeichen, anstatt es anzuhängen.quelle
Zunächst definieren Sie das Alphabet, das Sie verwenden möchten:
Verwenden Sie dann, um
openssl_random_pseudo_bytes()
die richtigen Zufallsdaten zu generieren:Schließlich verwenden Sie diese zufälligen Daten, um das Passwort zu erstellen. Da für jedes Zeichen in
$random
sein kann ,chr(0)
bischr(255)
verwendet der Code , den Rest nach der Teilung seines Ordinalwertes mit$alphabet_length
um sicherzustellen , dass nur Zeichen aus dem Alphabet werden gepflückt (beachten Sie, dass dabei die Zufälligkeit so vorbelastet):Alternativ und im Allgemeinen besser ist die Verwendung von RandomLib und SecurityLib :
quelle
%
erzeugt eine voreingenommene Ausgabe. Allerdings stark +1 für RandomLib. Das Rad nicht neu erfinden.Kurze Methoden ..
Hier sind einige der kürzesten Methoden zum Generieren der zufälligen Zeichenfolge
quelle
Ich habe die Leistung der gängigsten Funktionen dort getestet. Die Zeit, die benötigt wird, um 1'000'000 Zeichenfolgen mit 32 Symbolen auf meiner Box zu generieren, beträgt:
Bitte beachten Sie, dass es nicht wichtig ist, wie lange es wirklich gedauert hat, sondern welche langsamer und welche schneller ist, damit Sie entsprechend Ihren Anforderungen auswählen können, einschließlich Kryptografie-Bereitschaft usw.
substr () um MD5 wurde aus Gründen der Genauigkeit hinzugefügt, wenn Sie eine Zeichenfolge benötigen, die kürzer als 32 Symbole ist.
Zur Beantwortung: Die Zeichenfolge wurde nicht verkettet, sondern überschrieben, und das Ergebnis der Funktion wurde nicht gespeichert.
quelle
PHP 7+ Generieren Sie mit der Funktion random_bytes kryptografisch sichere Zufallsbytes .
Mögliche Ausgabe
PHP 5.3+ Generieren Sie pseudozufällige Bytes mit der Funktion openssl_random_pseudo_bytes .
Mögliche Ausgabe
Der beste Anwendungsfall könnte sein
Mögliche Ausgabe
quelle
Ein sehr schneller Weg ist, etwas zu tun wie:
Dadurch wird eine zufällige Zeichenfolge mit einer Länge von 10 Zeichen generiert. Natürlich könnten einige sagen, dass es auf der Berechnungsseite etwas schwerer ist, aber heutzutage sind Prozessoren so optimiert, dass sie den md5- oder sha256-Algorithmus sehr schnell ausführen. Und wenn die
rand()
Funktion denselben Wert zurückgibt, ist das Ergebnis natürlich dasselbe und es besteht eine Chance von 1/32767, dass es dasselbe ist. Wenn Sicherheit das Problem ist, wechseln Sie einfachrand()
zumt_rand()
quelle
quelle
Dieser wurde aus Administratorquellen entnommen :
Adminer , in PHP geschriebenes Datenbankverwaltungstool.
quelle
Hilfsfunktion aus dem Laravel 5-Framework
quelle
Quelle von http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/
quelle
Die bearbeitete Version der Funktion funktioniert einwandfrei, aber ich habe nur ein Problem festgestellt: Sie haben das falsche Zeichen verwendet, um $ Zeichen einzuschließen, sodass das Zeichen 'manchmal Teil der zufälligen Zeichenfolge ist, die generiert wird.
Um dies zu beheben, ändern Sie:
zu:
Auf diese Weise werden nur die eingeschlossenen Zeichen verwendet, und das Zeichen 'wird niemals Teil der zufälligen Zeichenfolge sein, die generiert wird.
quelle
Ein weiterer Einzeiler, der eine zufällige Zeichenfolge von 10 Zeichen mit Buchstaben und Zahlen generiert. Es erstellt ein Array mit
range
(passen Sie den zweiten Parameter an, um die Größe festzulegen), durchläuft dieses Array und weist ein zufälliges ASCII-Zeichen (Bereich 0-9 oder az) zu. Anschließend wird das Array implodiert, um eine Zeichenfolge zu erhalten.Hinweis: Dies funktioniert nur in PHP 5.3 und höher
quelle
rand(0, 57-48+122-97)<57-48?...:...
? :)Einzeiler.
Es ist schnell für große Saiten mit einer gewissen Einzigartigkeit.
quelle
md5(rand())
ist eine schrecklich unsichere Methode, um eine Zufallszahl zu generieren.Seit php7 gibt es die random_bytes-Funktionen. https://www.php.net/manual/ru/function.random-bytes.php Sie können also eine solche zufällige Zeichenfolge generieren
quelle
Ich mochte den letzten Kommentar, der openssl_random_pseudo_bytes verwendete, aber es war keine Lösung für mich, da ich immer noch die Zeichen entfernen musste, die ich nicht wollte, und ich konnte keine Zeichenfolge mit festgelegter Länge erhalten. Hier ist meine Lösung ...
quelle
quelle
Hier ist meine einfache einzeilige Lösung, um ein benutzerfreundliches Zufallskennwort zu generieren, mit Ausnahme der Zeichen, die ähnlich aussehen, wie "1" und "l", "O" und "0" usw. Hier sind es 5 Zeichen, aber Sie können es leicht tun ändere es natürlich:
quelle
Hier ist eine andere Lösung.
PS. Ich benutze PHP 7.2 unter Ubuntu.
quelle
Eine andere Möglichkeit, eine zufällige Zeichenfolge in PHP zu generieren, ist:
quelle
Hier ist, wie ich es mache, um einen echten eindeutigen Zufallsschlüssel zu erhalten:
Sie können time () verwenden, da es sich um einen Unix-Zeitstempel handelt und im Vergleich zu anderen oben genannten Zufällen immer eindeutig ist. Sie können dann die md5-Summe davon generieren und die gewünschte Länge aus der generierten MD5- Zeichenfolge entnehmen . In diesem Fall verwende ich 10 Zeichen und könnte eine längere Zeichenfolge verwenden, wenn ich sie eindeutiger machen möchte.
Ich hoffe das hilft.
quelle
time()
ist es alles andere als einzigartig: Es wird immer wieder den gleichen Wert zurückgeben, bis die aktuelle Sekunde endet. Was hier wirklich Zufälligkeit bietet, ist: Derstr_shuffle()
Rest des Codes reduziert nur die Stichprobe, aus der Zeichen ausgewählt werden können.time()
(es ist nur ein Zeitstempel), es ist eine schwache Quelle der Zufälligkeit.Parametrisierter Einzeiler, der nur native PHP-Funktionen verwendet und seit PHP 5.1.0 funktioniert
quelle