Zufallswerte (z.B. fuer Passwoerter)
Anna Heitmann
- php
0 Lemmy Danger0 fastix
0 Tobias K.0 Henryk Plötz0 Tobias K.0 Henryk Plötz0 ANNA
Hallo Leser,
ich moechte mittels eines PHP-Scriptes Zufallspasswoerter generieren.
Habt Ihr fuer mich einen Hinweis, wie ich das machen kann?
Viele Gruesse
Anna
Ei guude wie?
Ein kleiner Denkanstoss: In PHP gibt's die schöne Funktion rand(), mit der Du Zufallszahlen innerhalb eines bestimmten Wertebereichs generieren kannst. Die Ergebnisse nimmst Du als ASCII-Werte (0...255) und lässt den Buchstaben ausgeben, und zwar so oft, bis Du die Länge des gewünschten Passwortes erreicht hast. Mehr zur Funktion rand() und anderen auf http://www.php.net/manual/de/.
LG ausm Hesseland
Lemmy
Die Ergebnisse nimmst Du als ASCII-Werte (0...255) und lässt den Buchstaben ausgeben, und zwar so oft, bis Du die Länge des gewünschten Passwortes erreicht hast.
Schau vorher nach, ob dass eine gute Idee ist. Die ASCII- Zeichen beinhalten auch solche Zeichen wie [Zeilenumbruch] [Wagenrücklauf]. Sieh also vorher mal in eine ASCII- Tabelle sowie auf die Tastatur, welche Zeichen druck- und eingebbar sind...
Danke schoen!
Eure Antworten haben mir weitergeholfen!
VG ANNA
Hallo Anna,
ich moechte mittels eines PHP-Scriptes Zufallspasswoerter generieren.
du könntest mit rand()[1] Zahlen ausgeben lassen und die dann mit md5()[2] einen String erzeugen lassen (mit md5() ist er 32 Zeichen lang) um ein Passwort zu erhalten kannst du ihn auch kürzen um ein Passwort in der gewünschten Länge zu erhalten (wie man das am besten macht, kann ich dir jetzt auch nicht sagen, aber mit chunk_split()[4] könnte man was basteln (bitte nicht schlagen, wenn es eine schlechte Idee ist, aber ich weiß gerade nichts besseres :-))). Du kannst statt rand() auch time()[3] verwenden das dir den aktuellen Timestamp liefert, du erhälst also immer einen anderen Wert.
Grüße aus Nürnberg
Tobias
[1] http://www.php.net/manual/de/function.rand.php
[2] http://www.php.net/manual/de/function.md5.php
[3] http://www.php.net/manual/de/function.time.php
[4] http://www.php.net/manual/de/function.chunk-split.php
Moin,
du könntest mit rand()
Besser ist hier mt_rand(), ausserdem sollte das mt_srand() (bzw. srand() wenn du unbedingt rand() benutzen willst) nicht vergessen werden wenn du ein PHP kleiner 4.2 einsetzt, in der Doku steht mehr darüber.
Zahlen ausgeben lassen und die dann mit md5()
Dran denken dass die Ausgaben von md5() nur ein beschränktes Alphabet haben, ein damit erzeugtes Passwort muss also tendenziell länger sein als eines mit dem vollen Buchstabenumfang um die selbe Sicherheit zu erreichen.
Du kannst statt rand() auch time()
Ganz schlechte Idee. time() liefert wie der Name sagt immer die aktuelle Uhrzeit und die ist in höchstem Maße voraussagbar. Wenn man allein eine grobe Ahnung hat wann das Passwort damit erzeugt wurde, kann man in Windeseile alle Möglichkeiten durchprobieren. In einem Jahr erzeugt time() beispielsweise nur 31.557.600 verschiedene Werte, aber es gibt allein 308.915.776 Passwörter die nur aus 6 Kleinbuchstaben bestehen, und so ein Passwort wäre schon höchst unsicher gewählt.
Zur weiteren Vorgehensweise: Ich würde mir ja einen String nehmen in den ich alle in Frage kommenden Zeichen packe und dann mit Hilfe von mt_rand() zufällige Zeichen daraussuchen.
Ein Beispiel (der seed-Code stammt aus der Doku):
<?php
function make_seed() {
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());
$pass = "";
$zeichen = "abcdefghijklmnopqrstuvwxyz".
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".
"0123456789,.-;:_öäüÖÄÜ+*# ".
"'!"§$%&/()=?ß\@~µ{[]}²³°<>|";
for($i=0; $i < 8; $i++) $pass .= $zeichen[mt_rand(0,strlen($zeichen))];
echo $pass;
?>
Den Inhalt von $zeichen solltest du deinen Wünschen anpassen, ich hab' einfach mal alles reingepackt was auf meiner Tastatur so rumlag. Dran denken, dass " und \ mit einem \ escaped werden müssen.
Hallo Henryk,
du könntest mit rand()
Besser ist hier mt_rand(), ausserdem sollte das mt_srand()
das ist einfach schneller oder?
(bzw. srand() wenn du unbedingt rand() benutzen willst)
ich wusste nicht, das es mt_rand() gibt :-)
Dran denken dass die Ausgaben von md5() nur ein beschränktes Alphabet haben,
inwiefern ein beschränktes Alphabet?
ein damit erzeugtes Passwort muss also tendenziell länger sein als eines mit dem vollen Buchstabenumfang um die selbe Sicherheit zu erreichen.
das kommt darauf an wie sicher das Passwort sein soll (den Verwendungszweck hat Anna nicht genannt :-))
Du kannst statt rand() auch time()
Ganz schlechte Idee. time() liefert wie der Name sagt immer die aktuelle Uhrzeit und die ist in höchstem Maße voraussagbar.
mhh... stimmt, da habe ich nicht daran gedacht, vielleicht sollte man time() und mt_rand() kommbinieren?
Zur weiteren Vorgehensweise: Ich würde mir ja einen String nehmen in den ich alle in Frage kommenden Zeichen packe und dann mit Hilfe von mt_rand() zufällige Zeichen daraussuchen.
[...]
for($i=0; $i < 8; $i++) $pass .= $zeichen[mt_rand(0,strlen($zeichen))];
ok, das ist wirklich besser als mein Vorschlag (damit kann man dann ja auch ein beliebig langes Passwort generieren) - Danke, wieder was gelernt :-)
Den Inhalt von $zeichen solltest du deinen Wünschen anpassen, ich hab' einfach mal alles reingepackt was auf meiner Tastatur so rumlag.
:-) - aber manches dürfte doch etwas oversized sein, oder? Ich weiß nicht, ob jeder Dau eine hochgestellte 2 oder 3 hinbekommt :-)
Grüße aus Nürnberg
Tobias
Moin,
das ist einfach schneller oder?
Zum einen das und zum anderen potentiell zufälliger und damit sicherer als die Ausgabe von rand().
Dran denken dass die Ausgaben von md5() nur ein beschränktes Alphabet haben,
inwiefern ein beschränktes Alphabet?
Eine MD5-Summe ist eine 128stellige Binärzahl die üblicherweise als 32stellige Hexadezimalzahl dargestellt wird, d.h. in der Ausgabe von md5() kommen nur die Zeichen a-f und 0-9 vor. Für jedes Zeichen gibt es also nur 16 Möglichkeiten, was deutlich weniger als die 26 Kleinbuchstaben ist. Wenn man denn unbedingt einen fertigen String haben will (den man übrigens sinnvollerweise mit substr() statt chunk_split() zerlegt), dann sollte man sich lieber an die Ausgabe von base64_encode() halten, das erzeugt immerhin 64 mögliche Zeichen (plus "=" welches aber nur am Ende vorkommt).
das kommt darauf an wie sicher das Passwort sein soll
So stark einschränken muss man die Anzahl der möglichen Passwörter ja nun auch nicht künstlich.
:-) - aber manches dürfte doch etwas oversized sein, oder? Ich weiß nicht, ob jeder Dau eine hochgestellte 2 oder 3 hinbekommt :-)
Einfach Alt Gr+2 bzw. 3 drücken, steht doch auf der Tastatur draufgedruckt (auf meiner zumindest :). Wer ein @ hinbekommt, sollte das auch schaffen. Ich mache mir da schon eher Sorgen bezüglich unterschiedlicher Zeichensätze, weswegen es sich lohnen könnte das Alphabet auf die Kleinbuchstaben, Großbuchstaben, Zahlen und noch ein paar Satzzeichen einzuschränken.
Hi,
danke fuer Eure Antworten!
VG ANNA