[PHP] Random Pw-Gen

01/07/2014 11:11 Ravenstorm#1
Gehen wir von einem Passwort-Resett oder eine allgemeine Passwort-Vergabe bei einer neuen Registrierung. In beiden Fällen generieren wir ein Passwort und schicken es dem User. Hier eine Funktion für so eine Passwort-Generierung.

PHP Code:
    function rndPw($maxPwLength) {
        
$possibleChars "#0123456789+bBcCdDfFgGhHjJkKmMnNpPqQrRsStTvVwWxXyYzZ-";
         
        if(
$maxPwLength== "") {
            
$maxPwLength10;
        }

        
$count 0;
        
$password "";

        while((
$count $maxPwLength) && (strlen($possibleChars ) > 0)) {
            
$count ++;
            
$character substr($possibleCharsmt_rand(0strlen($possibleChars )-1), 1);
            
$possibleChars str_replace($character""$possibleChars );
            
$password .= $character;
        }

        return 
$password;
    } 
01/10/2014 12:06 Else#2
Am Rande: Wäre es nicht viel einfacher mit einer einfachen for-Schleife? So ersparst du dir das hochzählen der Variable, die while-Schleife weniger zu gebrauche, für das vorhaben. ;-)

Mit der Abfrage der gegebenen Passwortlänge geht es weiter: völlig sinnlos. Als Alternative kannst Du als Standard eine Zeichenfolge von 10 angeben und dann nur zwischendurch überprüfen, ob der Wert gegeben ist oder nicht und dann mit der intval-Funktion drüber laufen.
01/10/2014 12:25 Ravenstorm#3
Quote:
Originally Posted by Else View Post
Am Rande: Wäre es nicht viel einfacher mit einer einfachen for-Schleife? So ersparst du dir das hochzählen der Variable, die while-Schleife weniger zu gebrauche, für das vorhaben. ;-)

Mit der Abfrage der gegebenen Passwortlänge geht es weiter: völlig sinnlos. Als Alternative kannst Du als Standard eine Zeichenfolge von 10 angeben und dann nur zwischendurch überprüfen, ob der Wert gegeben ist oder nicht und dann mit der intval-Funktion drüber laufen.
Zum ersten: Wäre weniger umständlich ja, aber rein prinzipiell kein großer Unterschied denn die Variablen-Inkrementierung nimmt in dem Fall vllt. 0,02 ms in Anspruch.


Zum zweiten: Mein Beispiel bezieht sich auf ein php-script welches ich in ein Typo3-Cms integriert habe in dem man eben auf die Registrierung ein rnd-pw erhällt genau wie auf den pw-reset. Allerdings befindet sich die Funktion in einen meiner Modellen also verwende ich sie häufiger oder? Genau. Nämlich noch an 6 weiteren Stellen für diverse anderen Funktionen in welchen sie als Basis dient und eben mit dem Übergabeparameter getrimmt oder erweitert werden kann.
Bsp. Für die Pws benötige ich 10 Stellen und gebe bei dem Aufruf nichts an. Bei der Token generierung für sie 1-Minute cookies welche ich generiere auf der Webseite benötige ich nur 5 dann folgen 3 andere Parameter und dann erfolgt ein erneuter Aufruf diesmal mit 9 Stellen. War ein Beispiel von den 6.

Und somit halte ich die Abfrage für Sinnvoll. Man könnte die Variable auch global setzten, was sich nicht lohnt und von dem ich in einem modell sofort abraten würde.
04/21/2014 21:07 M4xicaner#4
Was Else sagt trifft schon zu.

So wie jetzt sollte die Fkt. ein 'Warning' und ein 'Notice' melden

Code:
Warning: Missing argument 1 for rndPw()
Notice: Undefined variable: maxPwLength
da kein 'Error' funktioniert sie zwar, ist aber nicht schön.

Eleganter wäre etwas wie
PHP Code:
function rndPw($maxPwLength=10){ ... } 
dann kann die Fkt. auch ohne Parameter aufgerufen werden.

Zusätzlich dazu kannst du noch was wie

PHP Code:
$maxPwLength = (intval($maxPwLength) == 10 $maxPwLength); 
einbauen, falls mal ein nicht-Integer übergeben wird oder die 0 übergeben wird.

mfg
05/25/2014 03:40 0xDnFx3#5
Ganz einfach:

Frage:
Warum immer while, for etc benutzen wenn man das ganze mit 2 Zeilen machen kann ?

PHP Code:
function getPassword($length 12)
{
    
$char_list '#0123456789+bBcCdDfFgGhHjJkKmMnNpPqQrRsStTvVwWxXyYzZ-';
    return (
substr(str_shuffle($char_list), 0$length ));

05/25/2014 14:23 CookieBone#6
Quote:
Originally Posted by 0xDnFx3 View Post
Frage:
Warum immer while, for etc benutzen wenn man das ganze mit 2 Zeilen machen kann ?
Weil dieses 2-Zeilen Snippet absoluter Müll ist. Ravenstorm hat schon ne ziemlich gute Lösung gepostet.
05/25/2014 17:02 Ravenstorm#7
Quote:
Originally Posted by CookieBone View Post
Weil dieses 2-Zeilen Snippet absoluter Müll ist. Ravenstorm hat schon ne ziemlich gute Lösung gepostet.
Da muss ich dir zustimmen.

Die 2-Zeiler-Variante ist lediglich Müll den man im Internet postet um schlau zu wirken. Bei genauerem hinsehen wird klar, dass so etwas total ungeeignet für Passwörter oder generell für so gut wie alles ist.

Du hast aus einem String-Satz maximal jedes Zeichen 1 mal -> Useless.
05/26/2014 01:12 dowhile#8
Quote:
Originally Posted by Ravenstorm View Post
Da muss ich dir zustimmen.

Die 2-Zeiler-Variante ist lediglich Müll den man im Internet postet um schlau zu wirken. Bei genauerem hinsehen wird klar, dass so etwas total ungeeignet für Passwörter oder generell für so gut wie alles ist.

Du hast aus einem String-Satz maximal jedes Zeichen 1 mal -> Useless.
Der Code vom TE lässt aber auch jedes Zeichen nur einmal rein.
05/26/2014 01:30 snow#9
Quote:
Originally Posted by Ravenstorm View Post
Du hast aus einem String-Satz maximal jedes Zeichen 1 mal -> Useless.
Und was macht dein Code?

Code:
$character = substr($possibleChars, mt_rand(0, strlen($possibleChars )-1), 1);
$possibleChars = str_replace($character, "", $possibleChars );
05/26/2014 08:46 Ravenstorm#10
Weil das ganze auch so schwer änderbar ist ->

PHP Code:
    function rndPw($maxPwLength) {
        
$possibleChars "#0123456789+bBcCdDfFgGhHjJkKmMnNpPqQrRsStTvVwWxXyYzZ-";
         
        if(
$maxPwLength== "") {
            
$maxPwLength10;
        }

        
$count 0;
        
$password "";

        while(
$count $maxPwLength) {
            
$count ++;
            
$character substr($possibleCharsmt_rand(0strlen($possibleChars )-1), 1);
            
$password .= $character;
        }

        return 
$password;
    } 
Aber ja, meine Funktion hatte den selben "Fehler".
06/04/2014 08:19 Sedrika#11
Ich um die Zufallsrate zu verbessern solltest du wie hier mt_srand noch nutzen.
PHP Code:
        public function Generate$length 16 )
        {
            
$newpass '';
            
$string "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
            
mt_srand( (double)microtime() * 1000000 );
            for( 
$i 1$i <= $length$i++ )
                
$newpass .= substr$stringmt_rand0strlen$string ) -), );
            return 
$newpass;
        } 
06/04/2014 13:21 マルセル#12
Wo genau wäre das Problem, wenn jedes Zeichen nur einmal im Passwort vorkommt? Es ist nunmal ein zufallsgeneriertes Passwort, theoretisch ist der Zweizeiler schon "besser", sofern man keinen Wert darauf legt, welche Zeichen im Passwort wie oft vorkommen.
06/04/2014 13:31 Ravenstorm#13
Quote:
Originally Posted by マルセル View Post
Wo genau wäre das Problem, wenn jedes Zeichen nur einmal im Passwort vorkommt? Es ist nunmal ein zufallsgeneriertes Passwort, theoretisch ist der Zweizeiler schon "besser", sofern man keinen Wert darauf legt, welche Zeichen im Passwort wie oft vorkommen.
1. Begrenzte Passwortlänge
2. Unsicher (Brute-Forcebar)
06/04/2014 13:36 マルセル#14
Heutzutage ist mit der richtigen Maschine absolut alles bruteforcebar - Kauft man sich auch nur einen ansatzweise guten Server ist eine Passwortlänge von 16 Zeichen in maximal einigen Wochen erledigt - Dafür ist die Technik einfach zu stark heute. Und ein generiertes Passwort von >30 (?) Zeichen ist eh unnötig.
06/04/2014 13:37 Sedrika#15
Bei einem Passwort kommt es ja eher weniger an die Zeichen als auf die Länge an ;)