automatisches Passwort / ohne unerwünschte Zusammenstellungen

Grille

Erfahrenes Mitglied
Hallo ...

Ich versuche gerade ein gut lesbares/merkbares, automatisch erstelltest Passwort zu scripten.

Es funktioniert so auch recht gut, doch ich habe das Gefühl, dass es den Rechner ganzschön belastet, seitdem ich versuche die "schlechten Wörter" herauszufiltern.

hier das Script:
PHP:
function auto_passwort()
{
    $vokale_1 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
    $vokale_2 = array('a', 'e', 'i', 'o', 'u', 'ä', 'ö', 'ü', 'ei', 'au', 'eu', 'äu');
    $vokale_3 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
    $konsonanten_1 = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'Sch', 'Z', 'St', 'Qu', 'Sp',);
    $konsonanten_2 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'sch', 'ch', 'st', 'sp', 'ck', 'ss', 'tt', 'ff', 'gg', 'll', 'mm', 'nn', 'pp');
    $konsonanten_3 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'ck',);
    $auto_passwort = '';
    while(preg_match("!quu|scheis|geil|fuck|fick|suck|nutte|hure|ji|vagi||piss|pull|titt|möse|musch|sau|jauch|depp|kack|spin|po|quick|luse|lusch|peni|pimm|weich|hode!i",$auto_passwort) or $auto_passwort==''){
        mt_srand((double)microtime()*1000000);
        $auto_passwort .= $konsonanten_1[mt_rand(0, count($konsonanten_1)-1)];
        $auto_passwort .= $vokale_1[mt_rand(0, count($vokale_1)-1)];
        $auto_passwort .= $konsonanten_2[mt_rand(0, count($konsonanten_2)-1)];
        $auto_passwort .= $vokale_2[mt_rand(0, count($vokale_2)-1)];
        $auto_passwort .= $konsonanten_3[mt_rand(0, count($konsonanten_3)-1)];
        $auto_passwort .= $vokale_3[mt_rand(0, count($vokale_3)-1)];
    // Zahlenanhang
        for($i = 1; $i <= 3; $i++){
            $auto_passwort .= mt_rand(0, 9);
        }
    }
    // Ausgabe
    return $auto_passwort;
}

Gibt es eine bessere Lösung?
Wie kann ich herausfinden, wie stark ein Skript den Rechner belastet, und ob es noch vertretbar ist?

Gruß,
Grille
 
Wie kann ich herausfinden, wie stark ein Skript den Rechner belastet, und ob es noch vertretbar ist?
Zeit messen. Interessant ist bestimmt auch zu zählen, wie oft die Schleife durchlaufen wird. ;)

Bei php.net steht, dass man preg_match nur verwenden sollte, wenn unbedingt nötig; du kannst dir die Blacklist in einen Array packen und dann mit strpos arbeiten, vielleicht gehts dann auch schneller.

PS: [klug...]Einige der Wörte in der Blacklist sind eigtl überflüssig, da sie gar nicht zustande kommen können (Vokal + Konsonant sind ja immer abwechselnd).[/klug...] :-)

PS2: mt_srand braucht man seit PHP4.2 nich mehr =)
 
OK .. muss ich mal tüfteln ...

wenn ich mich nicht irre kann jedes dieser Worte zustandekommen .. siehe CODE

Danke ..
 
Dass es zu einer Endlosschleife kommt, liegt an dem regulären Ausdruck, der eine leere Alternative („foo||bar“) enthält, die immer zutrifft.
 
Hallo Gumbo ...
Kannst Du das mal bitte nochmal knapp erklären? Ich weis nicht wo und wie Du das meinst.

Ich ärgere mich gerade mit anderen Schleifen und Versuchen herum und es will nicht so richtig klappen.

Ich lese in anderen Tutorials oft etwas von einer Variablen $foo ... habe aber noch nicht begriffen, was das eigentlich sein soll.


... AH ... da ist eine Stelle mit zwei Strichen || .. ich verstehe
 
Zuletzt bearbeitet:
Das hier:

PHP:
function auto_passwort()
{
    $vokale_1 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
    $vokale_2 = array('a', 'e', 'i', 'o', 'u', '&auml;', '&ouml;', '&uuml;', 'ei', 'au', 'eu', '&auml;u');
    $vokale_3 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
    $konsonanten_1 = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'Sch', 'Z', 'St', 'Qu', 'Sp',);
    $konsonanten_2 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'sch', 'ch', 'st', 'sp', 'ck', 'ss', 'tt', 'ff', 'gg', 'll', 'mm', 'nn', 'pp');
    $konsonanten_3 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'ck',);
    $auto_passwort = '';
    while(preg_match("!quu|scheis|geil|fuck|fick|suck|nutte|hure|ji|vagi||piss|pull|titt|m&ouml;se|musch|sau|jauch|depp|kack|spin|po|quick|luse|lusch|peni|pimm|weich|hode!i",$auto_passwort) // zwischen vagi und piss ist nicht ein | sondern zwei ||...
 or $auto_passwort==''){
        mt_srand((double)microtime()*1000000);
        $auto_passwort .= $konsonanten_1[mt_rand(0, count($konsonanten_1)-1)];
        $auto_passwort .= $vokale_1[mt_rand(0, count($vokale_1)-1)];
        $auto_passwort .= $konsonanten_2[mt_rand(0, count($konsonanten_2)-1)];
        $auto_passwort .= $vokale_2[mt_rand(0, count($vokale_2)-1)];
        $auto_passwort .= $konsonanten_3[mt_rand(0, count($konsonanten_3)-1)];
        $auto_passwort .= $vokale_3[mt_rand(0, count($vokale_3)-1)];
    // Zahlenanhang
        for($i = 1; $i <= 3; $i++){
            $auto_passwort .= mt_rand(0, 9);
        }
    }
    // Ausgabe
    return $auto_passwort;
}
 
Ah .. danke Felix ... ich dachte da steht was besonderes hinter.

ich habe auch den Fehler im Code gefunden:

das Passwort welches generiert wurde, wurde richtiger weise nach unerwünschten Zusammensetzungen durchsucht. Wenn es eine solche gefunden hat, wurden weitere Buchstaben an das alte Passwort angehängt anstatt das alte zu löschen und dann ein neues Passwort zusammenzubasteln.

hier jetzt richtig ... in der Schleife wird das Passwort erst geleert bevor die Buchstaben zusammengesetzt werden.

PHP:
function auto_passwort()
{
    $vokale_1 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
    $vokale_2 = array('a', 'e', 'i', 'o', 'u', '&auml;', '&ouml;', '&uuml;', 'ei', 'au', 'eu', '&auml;u');
    $vokale_3 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
    $konsonanten_1 = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'Sch', 'Z', 'St', 'Qu', 'Sp',);
    $konsonanten_2 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'sch', 'ch', 'st', 'sp', 'ck', 'ss', 'tt', 'ff', 'gg', 'll', 'mm', 'nn', 'pp');
    $konsonanten_3 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'ck',);
    $auto_passwort = '';
    while(preg_match("!quu|scheis|geil|fuck|fick|suck|nutte|hure|ji|vagi|sperm|piss|pull|titt|m&ouml;se|musch|sau|jauch|depp|kack|spin|po|quick|luse|lusch|peni|pimm|weich|hode!i",$auto_passwort) or $auto_passwort==''){
        mt_srand((double)microtime()*1000000);
        $auto_passwort = '';
        $auto_passwort .= $konsonanten_1[mt_rand(0, count($konsonanten_1)-1)];
        $auto_passwort .= $vokale_1[mt_rand(0, count($vokale_1)-1)];
        $auto_passwort .= $konsonanten_2[mt_rand(0, count($konsonanten_2)-1)];
        $auto_passwort .= $vokale_2[mt_rand(0, count($vokale_2)-1)];
        $auto_passwort .= $konsonanten_3[mt_rand(0, count($konsonanten_3)-1)];
        $auto_passwort .= $vokale_3[mt_rand(0, count($vokale_3)-1)];
    // Zahlenanhang
        for($i = 1; $i <= 3; $i++){
            $auto_passwort .= mt_rand(0, 9);
        }
    }
    // Ausgabe
    return $auto_passwort;
}
 
Ein kleiner Verbesserungsvorschlag:
PHP:
function auto_passwort( $badwords=null )
{
	$vokale_1 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
	$vokale_2 = array('a', 'e', 'i', 'o', 'u', 'ä', 'ö', 'ü', 'ei', 'au', 'eu', 'äu');
	$vokale_3 = array('a', 'e', 'i', 'o', 'u', 'ei', 'au', 'eu');
	$konsonanten_1 = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'Sch', 'Z', 'St', 'Qu', 'Sp',);
	$konsonanten_2 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'sch', 'ch', 'st', 'sp', 'ck', 'ss', 'tt', 'ff', 'gg', 'll', 'mm', 'nn', 'pp');
	$konsonanten_3 = array('b', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'ck',);
	$pattern = ( is_array($badwords) && !empty($badwords) ) ? strtolower('/'.implode('|', $badwords).'/') : null;
	do {
		$retVal  = '';
		$retVal .= $konsonanten_1[mt_rand()%count($konsonanten_1)];
		$retVal .= $vokale_1[mt_rand()%count($vokale_1)];
		$retVal .= $konsonanten_2[mt_rand()%count($konsonanten_2)];
		$retVal .= $vokale_2[mt_rand()%count($vokale_2)];
		$retVal .= $konsonanten_3[mt_rand()%count($konsonanten_3)];
		$retVal .= $vokale_3[mt_rand()%count($vokale_3)];
	} while( !empty($pattern) && preg_match($pattern, strtolower($retVal)) );
	$retVal .= sprintf('%03u', mt_rand(0, 999));
	return $retVal;
}

auto_passwort(array('quu', 'scheis', 'geil', 'fuck', 'fick', 'suck', 'nutte', 'hure', 'ji', 'vagi', 'sperm', 'piss', 'pull', 'titt', 'möse', 'musch', 'sau', 'jauch', 'depp', 'kack', 'spin', 'po', 'quick', 'luse', 'lusch', 'peni', 'pimm', 'weich', 'hode'));
Damit lässt sich die Negativliste flexibel angeben.
 
Leider verstehe ich nur die Hälfte von dem was du da gebastelt hast, benutze es aber, weil es recht flüssig läuft und professioneller aussieht ;-)

ich habe das array mit den badwords in die funktion zurückgelegt ... wenn mir noch ein mieses Wort einfällt, ändere ich es in der Funktion nach ...

Vielen Dank :)
 
Zurück