Generieren Sie einzigartige zufällige alphanumerische Zeichen 7 Zeichen lang
Es muss nicht sinnvoll sein, Worte, die - eher zufällige Passwort-Erzeugung, aber der Haken ist - Sie sollte eindeutig sein. Ich werde mit diesem für eine Art von Paket /Produkt-code. Welche ist die beste Methode zur Verfügung? 🙂
Warum haben Sie Ihre Passwörter müssen eindeutig sein?
Er/Sie sagte, "Passwörter", auch nicht "Passwörter". So weit wie ich kann sagen, es ist ein Produkt-code, und diejenigen, die auf jeden Fall eindeutig sein.
Kleine sidenote: wenn Sie diese codes, bewusst sein, dass SCHLIEßLICH werden Sie geben Sie einen code der lautet: "F*CKYOU"
Netter Punkt. Ich hatte eine Funktion, die erzeugten Konsonanten und Vokale alternativ, ich benutze es, um die macht einige CAPTCHA-5-char-strings... Während der Prüfung bekam ich eine, die sagte merda (übersetzung = sht) und ein älterer client hat etwas wütend, weil er einen haben, sagte Ordner (übersetzung = fck)...
Was ich in der Vergangenheit getan haben, wenn ich Sie brauchte ein Passwort-generator ist, wie Jon ' s Antwort mit den
Er/Sie sagte, "Passwörter", auch nicht "Passwörter". So weit wie ich kann sagen, es ist ein Produkt-code, und diejenigen, die auf jeden Fall eindeutig sein.
Kleine sidenote: wenn Sie diese codes, bewusst sein, dass SCHLIEßLICH werden Sie geben Sie einen code der lautet: "F*CKYOU"
Netter Punkt. Ich hatte eine Funktion, die erzeugten Konsonanten und Vokale alternativ, ich benutze es, um die macht einige CAPTCHA-5-char-strings... Während der Prüfung bekam ich eine, die sagte merda (übersetzung = sht) und ein älterer client hat etwas wütend, weil er einen haben, sagte Ordner (übersetzung = fck)...
Was ich in der Vergangenheit getan haben, wenn ich Sie brauchte ein Passwort-generator ist, wie Jon ' s Antwort mit den
$allowed_chars
string, aber entfernt alle Vokale, sowie Zeichen, die möglicherweise fehlinterpretiert werden als andere Zeichen: 1, l, 0
InformationsquelleAutor Prasanth | 2010-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Generell ist es nicht möglich zu generieren Sequenzen, die sowohl einzigartig und zufällige Elemente: natürlich, einzigartig zu sein, die Algorithmus hat zu berücksichtigen, der zuvor erzeugten Elemente in der Reihenfolge, so dass die nächste, nicht wirklich zufällig sein.
Daher, Ihre beste Wette wäre, um Kollisionen festzustellen und nur wiederholen (und das kann sehr teuer werden, in deinem speziellen Fall).
Wenn Sie gezwungen sind, auf 7 chars, es gibt nicht viel Sie tun können, oben:
Dieser sollte schließlich geben Sie ein neues Kennwort ein.
Jedoch, in ähnlichen Fällen habe ich festgestellt das ich in der Regel wählen Sie eine größere Passwort-Größe, die zufällig auch die Größe der hex-Darstellung eine gängige hash-Funktion (z.B.
md5
). Dann können Sie machen es leichter auf sich selbst und weniger fehleranfällig:Dies hat auch den Vorteil, dass die Sequenz-Raum ist größer, daher wird es weniger Kollisionen. Sie können wählen Sie die Größe der hash-Funktion entsprechend der zu erwartenden Anzahl von Passwörter, die Sie generieren, in die Zukunft zu "garantieren" ein niedriges Zusammenstoß-Wahrscheinlichkeit und damit weniger Anrufe, um die möglicherweise teure
already_exists
Funktion.Ich denke ich habe den Punkt über 😉
InformationsquelleAutor Jon
Hier ist ein Weg, Sie könnten es tun ohne hashes oder Schleifen:
Als ein paar andere erwähnt haben, die Gewährleistung der Eindeutigkeit ist komplizierter, und Sie sollten nicht benötigte. Der einfachste Weg, die Sie tun können, es wäre das hinzufügen von zusätzlichen Zeichen am Ende, erhöht bei jedem Passwort generiert.
InformationsquelleAutor nickf
Hier ist etwas, das aussieht, zufällig und einmalig sein sollte und habe 7 chars für die Zeiten zu kommen:
Oder für ein wenig mehr Zufälligkeit und weniger Einzigartigkeit (zwischen 1000 und 10000 pro Sekunde):
Oder (Eindeutigkeit zwischen 100 und 10000 pro Sekunde) - das ist wahrscheinlich die beste option:
Oder (Eindeutigkeit zwischen 10 und 10000 pro Sekunde):
Bekommen Sie die Idee.
intval(microtime(true) * 10000) == -65867797
- dies gibt Ihnen ein 6 Zeichen ausgegeben.Du hast Recht! Besser Tropfen, der in der ersten Zeile aus.
InformationsquelleAutor Alix Axel
Einer zufälligen alphanumerisch (base 36 =
0..9 + a..z
) Wert, hat 7 chars hat eine Basis 10 Vertretung zwischen2176782336
und78364164095
, der folgende Ausschnitt beweist es:Damit es einzigartig zu sein sind wir darauf angewiesen, eine nicht-wiederholte Faktor ist die offensichtliche Wahl ist
time()
:Wenn wir nur wollten, um sicherzustellen, eine minimale uniqueness-Faktor von 1 eindeutiger code pro Sekunde, die wir tun könnten:
Werden Sie bemerken, dass diese codes sind nicht zufällig, Sie werden auch bemerken, dass
time()
(1273508728
) ist weniger als2176782336
(die minimale Basis 10 Darstellung 7 char-code), das ist, warum ichtime() * 2
.Jetzt können einige date math, um die Zufälligkeit und erhöhen die Einzigartigkeit Faktor bei der Einhaltung der integer-Einschränkungen älterer Versionen von PHP (
< 5.0
?):Bezüglich
PHP_INT_MAX
ich bin mir nicht sicher, was genau geändert in den letzten Versionen von PHP, denn das folgende Werk deutlich in PHP 5.3.1, vielleicht könnte jemand etwas Licht in diese:Bekam ich ein bisschen verloren mit meinem Rationalisierung hier und mir ist langweilig also werde ich einfach Schluss wirklich schnell. Wir können so ziemlich die ganze base 36 charset und sicher generieren sequentielle - codes mit einem minimalen garantierten Einzigartigkeit Faktor 1 eindeutiger code pro Sekunde für 3.16887646 Jahren:
Ich erkannte, dass die oben erwähnt sind, können manchmal zurück duplizierte Werte, die durch das erste argument
mt_rand()
, um einzigartige Ergebnisse, die wir brauchen, zu begrenzen, eine unserer base 36 charset ein bisschen:Denken Sie daran, dass die oben genannten Werte sind immer noch sequentiell, in Reihenfolge zu make Sie Aussehen, zufällige, das wir verwenden können
microtime()
aber das können wir nur gewährleisten, das eine Einmaligkeit Faktor 10 codes pro Sekunde für 3,8 Monate:Dies erwies sich als schwieriger, als ich ursprünglich antecipated da gibt es viele Einschränkungen:
Wenn wir ignorieren können alle der oben genannten wäre es viel einfacher und ich bin sicher, dies kann weiter optimiert werden, aber wie ich schon sagte: das ist mir zu langweilig. Vielleicht möchte jemand diesen pick up, wo ich Links. =) Ich bin hungrig! =S
1000000
und nicht0000000
?Haben Sie Lesen die Frage und den ersten Absatz meiner Antwort?
Meine Frage wurde zu Ihrem ersten Absatz. Sie beweisen es, mit 1000000 innen
var_dump(base_convert('1000000', 36, 10));
statt 0000000. Ich Frage, warum? Die Frage fragt nach einer Zeichenfolge. Warum kann nicht ein string mit '0'beginnen?Naja man könnte, aber dann müsste man zum Auffüllen mit 0. Ich denke, dass ich nicht erwähnen, dass da der timestamp wird nie diese Art von niedrigen Werten.
InformationsquelleAutor Alix Axel
Gegeben, dass Sie erwähnen, Passwörter hier, nehme ich an, dass Sie benötigen eine sichere Methode (sprich: jemand sollte nicht in der Lage sein, zu erraten, um jemand anderes Passwort, basierend auf wissen, einem anderen Passwort). Könnten Sie Folgendes verwenden:
Wenn die Sicherheit ist nicht ein Problem, die Schritte 1 und 2 von selbst ausreichen würde. Wenn Sicherheit ein Problem ist, ist es wichtig, dass niemand, aber sich selbst weiß um den Wert von "MasterPassword".
Stimmte auf alle Punkte. Ich werde gerne zugeben, dass der Punkt im Hinblick auf die hex, du hast Recht, dass die mehr Potenzial Zeichen, desto besser. Einigten sich auch auf die Kürzung, aber kurz, die eine 32-stellige Passwörter (oder noch schlimmer) ist es unvermeidlich. Neben der hash ist mehr als ein Mittel der Erzeugung eines einzigartigen Passwort ein ähnlicher Ausgangspunkt, um andere Passwörter, als eine Sicherheitsmaßnahme. Wirklich, ein nicht-crypto-hash oder vielleicht ein CRC verwendet werden könnte, zu, außer, dass das master-Passwort anfälliger.
Kryptographische hashes sind nicht eindeutig. Sie sind natürlich nicht eindeutig, wenn Sie trunkieren. Diese Methode hat wirklich keinen Vorteil gegenüber einfach erzeugen zufällige Zeichenfolgen und-Prüfung solche zu sehen, ob Sie schon vergeben.
P. S. Und ich bin [etwas] big in crypto, so kann ich in Worte fassen, mein Unbehagen mit dieser Idee. 😉
OK, hab ich schlecht formuliert meine Antwort oben. Ich habe nie bedeuten, dass der hash eindeutig ist, ist lediglich, dass es mit sehr hoher Wahrscheinlichkeit einzigartig. Wenn Sicherheit gefordert ist, dann gibt es Vorteile dieser Methode im Vergleich zu einer nicht-cryptographic random string generator - es ist (nachweislich) für einen Angreifer schwieriger, reverse Engineering mit einem speziellen andere Benutzer, die das Kennwort gegeben, ein Beispiel der erzeugten Passwörter. Sie könnte im Grunde sehen Sie es als Charakter-Generierung unter Verwendung einer kryptographischen PRNG (der hash), in welchem Fall es ist in der Tat wenig Unterschied zwischen dieser Antwort und anderen.
InformationsquelleAutor Mac
Hier, wie ich dieses problem lösen würde:
Berücksichtigen, dass die 7 Zeichen kann einer der 26 Buchstaben (abc..z) und 10 Ziffern (01...9). Das macht 36 mögliche Zeichen.
Jedes mal, wenn Ihre Anwendung generiert einen neuen code, es increment global variable. Sie können diese einzigartige Zahl in eine eindeutige Zeichenfolge durch die Verwendung eines "Hexatridecimal" - Konverter, und durch hinzufügen von Füllstoff-Zeichen, um den rest des Strings.
Werfen Sie einen Blick auf diesen link. Ich denke, dieser Kerl hatte das gleiche problem wie du:
http://www.codemaxima.com/2010/04/the-hexatridecimal-numbering-system/
InformationsquelleAutor Michel Carroll
InformationsquelleAutor Cristian Rodriguez
+1, @Michael Haren Kommentar. Wenn die Passwörter auf Ihrer Website sollte nicht eine Einschränkung, einzigartig zu sein.
Wenn ich versuche, ein Passwort und ich bekomme eine Fehlermeldung, ich kann es nicht verwenden, weil es bereits im Einsatz sind, dann weiß ich, dass einige user auf dem system hat, dass das Passwort. Wenn es 1000 user ich brauche nur zu versuchen, ein Maximum von 1000 anderen Konten, bevor ich eins finden, wer hat das Passwort.
Nicht wirklich, deine Frage zu beantworten, aber mehr als einen Kommentar. Also ich bin zu markieren, in diesem CW.
Vielen Dank, ich habe nicht gelesen, seine Frage genau genug. Mein schlechtes! Ich lasse mein CW-Antwort hier, damit die Leser, die erwägen, zwingt die Passwörter eindeutig sein, können die Zähler-argument.
InformationsquelleAutor
InformationsquelleAutor David Morrow
dies ist meine Lieblings-Weg, es zu tun.
uniqid verwendet die aktuelle Uhrzeit zu generieren, die eine sehr einzigartige, zufällige Zeichenfolge. die Ergebnisse sehen aus wie "3f456yg".
InformationsquelleAutor Kyle
Galen ' s Antwort lässt nur einen verwenden, der jedes Zeichen in das Passwort. Nicht viel Informationen im string. Eine einfache änderung, aber:
InformationsquelleAutor Mike
InformationsquelleAutor SCC
versuchen, diese
wird es geben, string mit der Länge 5.
InformationsquelleAutor AkshayP
Verwenden Kohana text,
http://docs.kohanaphp.com/helpers/text
Beispielsweise
Wenn Sie nicht möchten, verwenden Sie den Rahmen, können Sie einfach den code zu kopieren. Finden Sie viele leckereien gibt.
InformationsquelleAutor ZZ Coder
Heres eine sehr einfache Art und Weise
Müssen Sie implementieren Ihre eigenen check_unique Funktion. Das Teil sollte einfach sein.
InformationsquelleAutor Galen