Thema geschlossen
Ergebnis 1 bis 2 von 2

Thema: [PHP] Zufallspasswort - Generator

  1. #1
    Projektleiter Avatar von Jann Hendrik
    Registriert seit
    02.12.2004
    Ort
    Wildeshausen
    Beiträge
    3.298
    Blog-Einträge
    32

    Standard [PHP] Zufallspasswort - Generator

    Zufallspasswort-Generator mit PHP:


    In diesem Tutorial geht es um die Erstellung von Zufallpasswörtern.



    Inhalt:




    Grundlagen
    Immer wieder braucht man schnell ein Passwort, das ausreichend sicher ist. Sicherheit bedeutet, dass man es nicht erraten kann. Der Name eurer Freundin ist ebenso schlecht als Passwort geeignet wie der eures Haustieres.

    Sicherheit kann man gewinnen, indem man das Passwort nicht mehrfach verwendet und möglichst viele Kombinationen zulässt. Mit zunehmender Länge steigt aber auch die Gefahr, dass man sich vertippt.

    Damit die Passwörter nicht immer ein asdf oder test beinhalten, wenn ihr sie selbst tippt könnt ihr ab sofort mit diesem Passwort-Generator sicherere Passwörter erstellen.
    Die Funktion kann aber ebenso gut auch in die eigene Anwendung integriert werden, was gelegentlich notwendig ist.

    Mehr zu sicheren Passwörtern hier.





    sichere Passwörter per Generator erstellen
    Die Anwendung der Funktion soll letztlich so sein, dass die Passwortlänge vorgegeben werden kann (aber nicht muss) und Sonderzeichen sowie Großbuchstaben optional deaktivierbar sind.

    Die Funktion soll daher wie folgt aufgerufen werden können:
    PHP-Code:
    echo CreatePassword(); 
    oder, um eine definierte Länge zu erhalten:
    PHP-Code:
    $length 10
    echo CreatePassword($length); 
    Damit Sonderzeichen und Großbuchstaben wie erwähnt genutzt werden können:
    PHP-Code:
    $length 0
    $capitals 
    true
    $specialSigns 
    true

    echo CreatePassword($length $capitals $specialSigns); 
    Nun fehlt nur noch die Innerei - die Funktion selbst.


    So der prinzipielle Aufbau:
    PHP-Code:
    function CreatePassword($length 7$capitals true$specialSigns true)
    {
      
    // ...
      
    return $passwort;

    Ein 0 Zeichen langes Passwort macht natürlich keinen Sinn, also beginne ich mit einer Überprüfung der übergebenen Länge:

    PHP-Code:
    if($length 8)
      
    $length mt_rand(8,20); 
    hier wird also die Länge geprüft, und wenn sie zufällig lang sein soll, dann wird das Passwort zwischen 8 und 20 Zeichen lang. Natürlich könnt ihr die Länge ändern, jedoch bin ich der Meinung, dass es mindestens acht Zeichen haben sollte und mehr als 20 Zeichen hält eh keiner aus richtig zu tippen :)


    Letzlich soll aus einem array() zufällig der eine oder andere Wert rausgepickt werden.

    Damit das geschehen kann, muss das array vorher 'gefüllt' werden.

    Kleine Buchstaben und Zahlen sind immer mit drin, darum werden sie in das array geschrieben:
    PHP-Code:
    $array = array();

    # Zahlen
    for($i=48;$i<58;$i++)
      
    $array[] = chr($i);

    # kleine Buchstaben
    for($i=97;$i<122;$i++)
      
    $array[] = chr($i); 
    hierbei bediene ich mich der Funktion chr, die ein Zeichen aus dem ASCII-Zeichensatz nimmt.

    Welche zur Verfügung stehen lässt sich leicht ermitteln, indem man eine for-Schleife nimmt und einige Werte ausgibt.


    Weiter geht es mit den Großbuchstaben. Wenn diese gewünscht werden, so werden sie ins array geschrieben. Es muss also eine Überprüfung stattfinden, ob der entsprechende Wert der Funktion übergeben wurde.

    PHP-Code:
    # Großbuchstaben
    if($capitals)
      for(
    $i=65;$i<90;$i++)
        
    $array[] = chr($i); 
    Selbiges geschieht für die Sonderzeichen, die in der ASCII-Tabelle jedoch ein wenig verstreut wurden, weshalb hier mehrere Zeilen benötigt werden.
    PHP-Code:
    # Sonderzeichen:
    if($specialSigns)
    {
      for(
    $i=33;$i<47;$i++)
        
    $array[] = chr($i);
      for(
    $i=59;$i<64;$i++)
        
    $array[] = chr($i);
      for(
    $i=91;$i<96;$i++)
        
    $array[] = chr($i);
      for(
    $i=123;$i<126;$i++)
        
    $array[] = chr($i);

    Nun ist das array gefüllt und wartet nur noch darauf, dass wir Werte daraus auslesen.
    Die Funktion mt_srand sorgt dafür, dass ein interner Startwert für den Zufallsgenerator mt_rand festgelegt wird.
    Das Handbuch schreibt dazu:
    Gleiche Startwerte führen auch jeweils zu derselben Pseudo-Zufallssequenzen daher ist es üblich, diese über die aktuelle Uhrzeit festzulegen
    Das sieht dann wie folgt aus:
    PHP-Code:
    mt_srand((double)microtime()*1000000); 
    Nun muss noch der Rückgabewert definiert werden. Da wir in einer Schleife einzelne Zeichen an den späteren Rückgabewert anhängen, sollten wir vorher sicherstellen, dass dieser leer ist:

    PHP-Code:
    $passwort ''
    So - und nun zum Herzstück.
    Die Funktion mt_rand wird dafür benutzt.

    Die Funktion liefert eine Zahl im Bereich 'von bis'.
    Als Startwert wird das erste Zeichen des arrays genommen - als letztes mögliche Zeichen soll das letzte Zeichen genommen werden. Die Anzahl der Zeichen kann mittels count ermittelt werden. Da das Zählen des array aber mit 0 beginnt, muss genau ein Wert abgezogen werden.

    PHP-Code:
    mt_rand(0count($array)-1
    Darüber wird nun eine Zahl erhalten, die wir benutzen können, um genau ein Zeichen aus dem array anzusprechen. Daher wähle ich folgendes:

    PHP-Code:
    $array[mt_rand(0count($array)-1)] 
    das wird lediglich an das Passwort angehängt:
    PHP-Code:
    $passwort .= $array[mt_rand(0count($array)-1)]; 
    und das geschieht mehrfach - dafür bietet sich die for-Schleife an. In Anhängigkeit der Länge, die das Passwort letztlich haben soll:


    PHP-Code:
    for ($i=1$i<=$length$i++)
    {
      
    $rnd mt_rand0count($array)-);
      
    $passwort .= $array[$rnd];

    So - und im ganzen sieht das dann so aus:


    PHP-Code:
    <?php

    /*
     * @param integer  $length
     * @param boolean  $capitals
     * @param boolean  $specialSigns
     *
     * @return string
     */
      
    function CreatePassword($length 7$capitals true$specialSigns true)
      {
        
    $array = array();


        if(
    $length 8)
          
    $length mt_rand(8,20);

        
    # Zahlen
        
    for($i=48;$i<58;$i++)
          
    $array[] = chr($i);

        
    # kleine Buchstaben
        
    for($i=97;$i<122;$i++)
          
    $array[] = chr($i);

        
    # Großbuchstaben
        
    if($capitals )
          for(
    $i=65;$i<90;$i++)
            
    $array[] = chr($i);

        
    # Sonderzeichen:
        
    if($specialSigns)
        {
          for(
    $i=33;$i<47;$i++)
            
    $array[] = chr($i);
          for(
    $i=59;$i<64;$i++)
            
    $array[] = chr($i);
          for(
    $i=91;$i<96;$i++)
            
    $array[] = chr($i);
          for(
    $i=123;$i<126;$i++)
            
    $array[] = chr($i);
        }

        
    mt_srand((double)microtime()*1000000);
        
    $passwort '';

        for (
    $i=1$i<=$length$i++)
        {
          
    $rnd mt_rand0count($array)-);
          
    $passwort .= $array[$rnd];
        }

        return 
    $passwort;
      }
    ?>
    Und wie die Funktion aufgerufen werden kann habt ihr bereits oben gelesen, allerdings solltet ihr dann einen Blick auf die Funktion htmlspecialchars werfen, andernfalls könnte es Probleme mit der Ausgabe geben, da einige Sonderzeichen auch in HTML Verwendung finden.

    PHP-Code:
    <?php
      
    echo htmlspecialchars(CreatePassword());
    ?>
    Wer die Funktion nur mal eben schnell nutzen will, der kann das hier tun.





    mnemonische Passwörter per Generator erstellen
    Gelegentlich braucht man auch Zufallspasswörter, die leicht merkbar sind. Dabei helfen mnemonische Passwörter.

    Anmerkung: das schränkt die Möglichkeiten der erstellten Passwörter - und damit letztlich auch die Sicherheit ein!

    Der etwas dürftige Wikipedida-Artikel definiert wie folgt:
    Zitat Zitat von http://de.wikipedia.org/wiki/Mnemonik
    Die Mnemonik oder Mnemotechnik ist die Gedächtniskunst, also Regeln, Kniffe und Tricks, das Erinnerungsvermögen zu unterstützen und leistungsfähiger zu machen. Eine bekannte mnemonische Technik ist die der Eselsbrücken.

    Der Aufbau der Passwörter wurde von mir in der Form gewählt, dass immer ein Pärchen aus 2 Buchstaben und letzlich eine wählbare Anzahl von Zahlen gebildet wird.

    Da Bezeichnungen und Namen, wenn sie leicht zu merken sind auch 'mnemonische Begriffe' genannt werden, habe ich die Funktion entsprechend genannt.
    Aufgerufen werden soll die Funktion dann mit zwei Parametern:
    1) der Anzahl der Buchstaben-Pärchen
    2) der Anzahl der angehängten Zahlen

    PHP-Code:
    <?php

    /*
     * @param integer  $lenght
     * @param integer  $digits
     *
     * @return string  $password
     */
      
    function mnemonischesPasswort($lenght 3$digits 0)
      {
        
    // ...

        
    RETURN $password;
      }
    ?>
    Um anschließend etwas 'aussprechbares' zu erhalten, werden bei den Buchtaben-Pärchen stets Vokale (im weiteren Sinn) und Konsonanten (im weiteren Sinn) gepaart.
    Im weiteren Sinn - damit meine ich, dass das y zu den Vokalen, was sprachlich nicht ganz korrekt, hier aber dienlich ist. Bei den Konsonanten habe ich auf das Q und das q verzichtet.

    Im Gegensatz zur oben vorgestellten Methode sammel ich nun alle Zeichen in jeweils einem string.

    PHP-Code:
    <?php

    /*
     * @param integer  $lenght
     * @param integer  $digits
     *
     * @return string  $password
     */
      
    function mnemonischesPasswort($lenght 3$digits 0)
      {
        
    // Variablen definieren
        
    $consonant "bcdfghjklmnprstvwxzBCDFGHJKLMNPRSTVWXZ";
        
    $vowels    "aeiouyAEIUY";
        
    $password  '';

        
    // ...

        
    RETURN $password;
      }
    ?>
    Ein einzelnen Zeichen aus einem string zu selektieren - das geht mit der Funktion substr und den entspr. Parametern.

    In der obigen Funktion wurde count verwendet, um zu ermitteln, wieviele Zeichen genutzt werden können. Bei einem string gilt es dafür die Funktion strlen zu benutzen.

    PHP-Code:
    $password .= substr($vowelsmt_rand(0strlen($vowels)-1), 1); 
    Das restliche Prinzip ist so, wie bei der oben vorgestellten Funktion:
    • Zeichenvorat anlegen
    • Zufallsfunktion nutzen um einzelne Zeichen aneinander zu reihen
    • generiertes Passwort mittels RETURN zurückgeben

    Im Gesamten sieht das dann so aus:
    PHP-Code:
    <?php

    /*
     * @param integer  $lenght
     * @param integer  $digits
     *
     * @return string  $password
     */
      
    function mnemonischesPasswort($lenght 3$digits 0)
      {
        
    // Variablen definieren
        
    $consonant "bcdfghjklmnprstvwxzBCDFGHJKLMNPRSTVWXZ";
        
    $vowels    "aeiouyAEIUY";
        
    $password  '';

        
    mt_srand((double)microtime()*1000000);

        
    // Vokal/Konsonant-Paare erzeugen
        
    for($i 1$i <= $lenght$i++)
        {
          
    $password .= substr($consonantmt_rand(0strlen($consonant)-1), 1);
          
    $password .= substr($vowelsmt_rand(0strlen($vowels)-1), 1);
        }

        
    // Zahlen anhängen
        
    for($i 1$i <= $digits$i++)
          
    $password .= mt_rand(09);

        RETURN 
    $password;
      }
    ?>
    Während der Arbeit zu diesem Tutorial wurde ich auf eine andere Möglichkeit aufmerksam gemacht Passwörter zu erzeugen, für die jedoch gilt, dass sie einen eingeschränkten Zeichensatz haben - und man sie sich auch nicht unbedingt merken kann.
    PHP-Code:
    <?php
      $password 
    substr(md5(time()), 1010);
    ?>


    Jetzt solltet Ihr eigentlich in der Lage sein, einen Passwortgenerator ohne Vorlage nachzuprogrammieren. Die verwendeten Funktionen findet Ihr alle im PHP-Manual.

    Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im PHP-Forum mit einem Verweis auf dieses Tutorial.
    Danke.

    Ich hoffe, dass ich Euch hier etwas weiterhelfen konnte.

    Grüße Jann Hendrik
    Geändert von Jann Hendrik (25.11.2007 um 17:48 Uhr)
    Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!

  2. #2
    Erfahrener Benutzer
    Registriert seit
    04.01.2006
    Beiträge
    964

    Standard

    Der Vollständigkeit halber und da ich dort keine Schreibrechte hab hier ein paar Kommentare zu dem Tutorial (vielleicht mag ein Moderator das mal dorthin verschieben).
    Anmerkung der Projektleitung

    das habe ich (Jann Hendrik) damit mal getan


    * Ich finde den Umgang mit dem $length-Parameter absolut ungünstig. Warum setzt du den Standard-Wert nicht auf null und erzeugst in dem Fall, dass dieser nicht übergeben wurde eine zufällige Länge? Oder du nimmst zwei Parameter entgegen, die minimale und die maximale Länge. Aber so steigt da doch niemand durch. Wenn ich 6 übergebe bekomme ich keine Fehlermeldung sondern plötzlich ein 18 Zeichen langes Passwort! Viel Spaß beim debuggen. Dazu liegt der Default-Wert noch in einem "ungültigen" Bereich.

    * Die PHP-Funktion range() ist eine feine Sache, ebenso array_rand(). Damit lässt sich die ganze Funktion auf wenige Zeilen zusammenfassen.

    * Seit PHP 4.2.0 braucht es keinen expliziten Aufruf vom (mt_)srand() mehr. Steht auch im Handbuch.

    Note: As of PHP 4.2.0, there is no need to seed the random number generator with srand() or mt_srand() as this is now done automatically.
    * Bestimmte Zeichen stellen für ungeübte Benutzer eine ziemliche Herausforderung dar, diese einzugeben. Die Benutzer, mit denen ich zusammenarbeite, würden ohne Hilfe aussteigen, wenn sie z.B. eine Tilde oder eine Pipe eingeben müssten. Selbst geschweifte und eckige Klammern sind nicht ohne (die genannten Zeichen sind z.B. auf einer Mac-Tastatur gar nicht sichtbar). Backtick (Gravis) ist auch hart und kann genauso wie das Zirkumflex Probleme bei der Eingabe machen, denke ich (wenn danach ein Vokal eingegeben wird). Macht also Sinn, solche Zeichen nicht zu verwenden - zumindest, wenn der Support, den man anbietet nicht in Rechnung gestellt wird *g

    * Ein weiterer Punkt, der vielleicht interessant anzusprechen ist ist, dass bestimmte Zeichen je nach Ausgabemedium (Font und Schritgrad etc.) nicht leicht zu unterscheiden sind:

    o0O 1Il| `'

    Basti
    Geändert von Jann Hendrik (23.11.2007 um 12:51 Uhr)
    Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!

Thema geschlossen

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. [PHP] Datenbank-Backup mit mysqldumper (alt)
    Von Jann Hendrik im Forum Tutorials
    Antworten: 1
    Letzter Beitrag: 05.09.2009, 17:10
  2. Frage zum Tut: [PHP] Fremde Webseiten auslesen
    Von the_cRu im Forum PHP-Programmierung
    Antworten: 27
    Letzter Beitrag: 10.02.2007, 19:59
  3. [PHP] FTP-Funktionen in PHP nutzen
    Von MrNiceGuy im Forum Tutorials
    Antworten: 0
    Letzter Beitrag: 24.05.2006, 14:18
  4. [PHP] Formulare verstehen und auswerten
    Von WarrenFaith im Forum Tutorials
    Antworten: 5
    Letzter Beitrag: 21.03.2006, 17:11
  5. [PHP] Ein einfaches Template-System
    Von MrNiceGuy im Forum Tutorials
    Antworten: 0
    Letzter Beitrag: 09.10.2005, 18:30

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Impressum · Tutorials · Nutzungsbedingungen · thematisch sortierte Linklisten · Spendenaufruf · Team · Partnerprojekte

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48