Ich versuche ein zufälliges Passwort in PHP zu generieren.
Ich bekomme jedoch alle 'a' und der Rückgabetyp ist vom Typ Array und ich möchte, dass es ein String ist. Irgendwelche Ideen, wie man den Code korrigiert?
Vielen Dank.
function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass;
}
/dev/random
ausreichend, da die Frage nicht nach einem " sicheren " Passwort fragt (und nicht so bearbeitet werden sollte, dass es die Bedeutung der ursprünglichen Frage ändert). Obwohl ich alles für die Sicherheit bin, denke ich, dass diese Teppichbombe nicht vollständig durchdacht war. Wie bei der Verwendungmysql_*
sind die Antworten weiterhin gültig, sollten jedoch als unsicher markiert werden. Vielleicht ist dies etwas, das SO als zusätzliche Software einbinden muss - die Fähigkeit, vor unsicherem Code zu warnen ?Antworten:
Versuchen Sie dies (verwenden Sie
strlen
stattcount
, weilcount
auf einer Zeichenfolge immer steht1
):Demo: http://codepad.org/UL8k4aYK
quelle
$pass .= $alphabet[$n]
.mt_rand
ist auch nicht besser)openssl_random_pseudo_bytes()
anstelle vonrand()
TL; DR:
random_int()
und dierandom_str()
unten angegebenen.random_int()
, verwenden Sie random_compat .Erläuterung:
Da Sie ein Kennwort generieren , müssen Sie sicherstellen, dass das von Ihnen generierte Kennwort nicht vorhersehbar ist. Die einzige Möglichkeit, um sicherzustellen, dass diese Eigenschaft in Ihrer Implementierung vorhanden ist, besteht in der Verwendung eines kryptografisch sicheren Pseudozufallszahlengenerators (CSPRNG).
Die Anforderung für ein CSPRNG kann für den allgemeinen Fall von zufälligen Zeichenfolgen gelockert werden, jedoch nicht, wenn es um Sicherheit geht.
Die einfache, sichere und korrekte Antwort auf die Kennwortgenerierung in PHP besteht darin, RandomLib zu verwenden und das Rad nicht neu zu erfinden. Diese Bibliothek wurde sowohl von Sicherheitsexperten der Branche als auch von mir geprüft.
Für Entwickler, die es vorziehen, 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, bevor PHP 7 veröffentlicht wird. Die Verwendung unsererrandom_int()
Polyfüllung ist wahrscheinlich sicherer als das Schreiben einer eigenen Implementierung.Mit einem sicheren Generator für zufällige Ganzzahlen ist das Generieren einer sicheren Zufallszeichenfolge einfacher als Kuchen:
quelle
mcrypt_*
Funktionen Verfallswarnungen ausgegeben . Ich kann in einem Problem-Thread sehen, dass Sie die Bibliothek gegabelt haben, weil Sie @ircmaxell nicht erreichen können, aber in Ihrer Verzweigung steht "Build Failing" für Travis. Möchten Sie diese Antwort aktualisieren (die bei Google immer noch recht häufig angezeigt wird)?Ich weiß, dass Sie versuchen, Ihr Passwort auf eine bestimmte Weise zu generieren, aber vielleicht möchten Sie sich auch diese Methode ansehen ...
Es stammt von der php.net-Site und erstellt eine Zeichenfolge, die doppelt so lang ist wie die Zahl, die Sie in die Funktion openssl_random_pseudo_bytes eingegeben haben. Das obige würde also ein 4 Zeichen langes Passwort erstellen.
Zusamenfassend...
Würde ein Passwort mit 8 Zeichen Länge erstellen.
Beachten Sie jedoch, dass das Passwort nur die Zahlen 0-9 und Kleinbuchstaben af enthält!
quelle
openssl_random_pseudo_bytes()
ein leistungsstarker Zufallsgenerator für vollständige binäre Bytes und muss nicht weiter gemischt werden. Ich werde auch die Gelegenheit nutzen, um darauf hinzuweisen, dass es gefährlich ist anzunehmen, dass das Stapeln mehrerer Verschlüsselungsmethoden alles zufälliger macht. In einigen Fällen kann es aufgrund der akkumulierten Hashing-Kollisionen sogar genau umgekehrt sein.Winziger Code mit 2 Zeilen.
Demo: http://codepad.org/5rHMHwnH
quelle
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Wenn Sie mit PHP7 arbeiten, können Sie folgende
random_int()
Funktion verwenden:quelle
mt_rand
, um ein Passwort zu generieren.mt_rand
, daher ist es für Sicherheitszwecke immer noch ungeeignet.$chars
In einer Zeile:
quelle
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Entropie wiederhergestelltIhre beste Wahl ist die RandomLib-Bibliothek von ircmaxell .
Anwendungsbeispiel:
Es werden Zeichenfolgen erzeugt, die stärker zufällig sind als die normalen Zufallsfunktionen wie
shuffle()
undrand()
(was Sie im Allgemeinen für vertrauliche Informationen wie Passwörter, Salze und Schlüssel wünschen).quelle
rand()
odermt_rand()
.random_bytes
), aber das macht dierand
Antworten nicht falsch.rand
ist keine gute Wahl für Passwörterrand()
falschen Antworten . Sie sind von sich aus falsch!Sie wollen
strlen($alphabet)
nichtcount
die Konstantealphabet
(äquivalent zu'alphabet'
).Dies
rand
ist jedoch keine geeignete Zufallsfunktion für diesen Zweck. Seine Ausgabe kann leicht vorhergesagt werden, da er implizit mit der aktuellen Zeit gesetzt wird. Darüber hinausrand
ist nicht kryptografisch sicher; es ist daher relativ einfach, seinen internen Zustand aus der Ausgabe zu bestimmen.Lesen Sie stattdessen von
/dev/urandom
, um kryptografisch zufällige Daten zu erhalten.quelle
Ich werde eine Antwort posten, da einige der vorhandenen Antworten nahe beieinander liegen, aber eine der folgenden haben:
Diese Antwort umgeht das
count/strlen
Problem, da die Sicherheit des generierten Passworts, zumindest IMHO, über Ihre Anreise hinausgeht. Ich gehe auch von PHP> 5.3.0 aus.Lassen Sie uns das Problem in die Bestandteile aufteilen, die sind:
Für den ersten Teil bietet PHP> 5.3.0 die Funktion
openssl_random_pseudo_bytes
. Beachten Sie, dass die meisten Systeme zwar einen kryptografisch starken Algorithmus verwenden, Sie dies jedoch überprüfen müssen, damit ein Wrapper verwendet wird:Für den zweiten Teil verwenden wir,
base64_encode
da es eine Byte-Zeichenfolge benötigt und eine Reihe von Zeichen erzeugt, deren Alphabet dem in der ursprünglichen Frage angegebenen sehr nahe kommt. Wenn wir nicht mit nichts ausmachte+
,/
und=
Zeichen in der letzten Zeichenfolge erscheinen und wir ein Ergebnis zumindest wollen$n
Zeichen lang, könnten wir einfach nutzen:Der
3/4
Faktor beruht auf der Tatsache, dass die Base64-Codierung zu einer Zeichenfolge führt, deren Länge mindestens ein Drittel größer ist als die Byte-Zeichenfolge. Das Ergebnis ist genau,$n
wenn es ein Vielfaches von 4 und ansonsten bis zu 3 Zeichen länger ist. Da die zusätzlichen Zeichen überwiegend das Auffüllzeichen sind=
, können wir es auf die gewünschte Länge kürzen , wenn wir aus irgendeinem Grund die Einschränkung hatten, dass das Kennwort eine exakte Länge hat. Dies liegt insbesondere daran, dass für ein bestimmtes$n
Kennwort alle Kennwörter mit der gleichen Anzahl enden würden, sodass ein Angreifer, der Zugriff auf ein Ergebniskennwort hatte, bis zu 2 Zeichen weniger erraten müsste.Wenn wir für zusätzliche Gutschriften die genaue Spezifikation wie in der Frage des OP erfüllen wollten, müssten wir ein bisschen mehr Arbeit leisten. Ich werde hier auf den Ansatz der Basiskonvertierung verzichten und mich für einen schnellen und schmutzigen entscheiden. Beide müssen aufgrund des 62-Eintrags langen Alphabets ohnehin mehr Zufälligkeit erzeugen, als im Ergebnis verwendet wird.
Für die zusätzlichen Zeichen im Ergebnis können wir sie einfach aus der resultierenden Zeichenfolge verwerfen. Wenn wir mit 8 Bytes in unserer Byte-Zeichenfolge beginnen, sind bis zu 25% der base64-Zeichen diese "unerwünschten" Zeichen, sodass das einfache Verwerfen dieser Zeichen zu einer Zeichenfolge führt, die nicht kürzer als das gewünschte OP ist. Dann können wir es einfach abschneiden, um die genaue Länge zu erhalten:
Wenn Sie längere Kennwörter generieren, macht das Auffüllzeichen
=
einen immer kleineren Anteil des Zwischenergebnisses aus, sodass Sie einen schlankeren Ansatz implementieren können, wenn das Entleeren des für das PRNG verwendeten Entropiepools ein Problem darstellt.quelle
openssl_random_pseudo_bytes
dies zu einem schwachen Ergebnis führen könnte. Ich wusste nicht, dass das der Fall war.base_convert(uniqid('pass', true), 10, 36);
z.B.
e0m6ngefmj4
BEARBEITEN
Wie ich in den Kommentaren erwähnt habe, bedeutet die Länge, dass Brute-Force-Angriffe besser dagegen wirken als Timing-Angriffe. Daher ist es nicht wirklich relevant, sich Gedanken darüber zu machen, "wie sicher der Zufallsgenerator war". Die Sicherheit, speziell für diesen Anwendungsfall, muss die Benutzerfreundlichkeit ergänzen, damit die oben genannte Lösung für das erforderliche Problem tatsächlich gut genug ist.
Nur für den Fall, dass Sie bei der Suche nach einem sicheren Zufallszeichenfolgengenerator (wie ich annehme, dass einige Leute auf den Antworten basieren) auf diese Antwort gestoßen sind, wie zum Beispiel das Generieren von Token, würde ein Generator solcher Codes folgendermaßen aussehen:
quelle
Ein anderer (nur Linux)
quelle
fread()
werden standardmäßig 8192 Byte gepuffert, sodass Sie immer so viele/dev/urandom
mit dem angegebenen Code lesen können . Dies funktioniert auch nicht unter Windows. Ein großes Lob für die Verwendung eines CSPRNG.Ein bisschen schlauer sein:
Überprüfen Sie es hier .
quelle
Verwenden Sie diesen einfachen Code, um ein Med-Strong-Passwort mit einer Länge von 12 zu generieren
quelle
Versuchen Sie dies mit Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen
Beispielausgabe (n):
, IZCQ_IV \ 7
@wlqsfhT (d
1! 8 + 1 \ 4 @ uD
quelle
rand
Funktion ist nicht wirklich kryptografisch sicher, so dass es ein ziemliches Risiko sein kann, ein Passwort damit zu generierenSchneller. Einfaches, sauberes und konsistentes Format, wenn Sie dies wünschen
quelle
Dies basiert auf einer anderen Antwort auf dieser Seite, https://stackoverflow.com/a/21498316/525649
Diese Antwort erzeugt nur Hex-Zeichen
0-9,a-f
. Versuchen Sie Folgendes für etwas, das nicht wie Hex aussieht:base64_encode
Gibt eine größere Verbreitung alphanumerischer Zeichen zurückrtrim
entfernt das=
manchmal am endeBeispiele:
32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7
Dies ist nicht sehr konfigurierbar, um eine Schnittstelle für Benutzer zu erstellen, aber für einige Zwecke ist das in Ordnung. Erhöhen Sie die Anzahl der Zeichen, um das Fehlen von Sonderzeichen zu berücksichtigen.
quelle
Nennen Sie es wie in den Kommentaren.
quelle
Ich habe ein umfassenderes und sichereres Passwortskript erstellt. Dadurch wird eine Kombination aus zwei Großbuchstaben, zwei Kleinbuchstaben, zwei Zahlen und zwei Sonderzeichen erstellt. Insgesamt 8 Zeichen.
quelle
quelle
Erzeugt ein sicheres Passwort der Länge 8, das mindestens einen Kleinbuchstaben, einen Großbuchstaben, eine Ziffer und ein Sonderzeichen enthält. Sie können auch die Länge im Code ändern.
quelle
Diese Funktion generiert ein Passwort basierend auf den Regeln in den Parametern
quelle
Hier ist meine Einstellung zur zufälligen einfachen Generierung von Passwörtern.
Es stellt sicher, dass das Passwort Zahlen, Groß- und Kleinbuchstaben sowie mindestens 3 Sonderzeichen enthält.
Die Länge des Passworts liegt zwischen 11 und 30.
quelle