Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] Zufallspasswort - Generator

Layoutprobleme? - Styleswitcher!

Antwort
 
Themen-Optionen
Alt 01.02.2007, 20:09 Nach oben    #1
Jann Hendrik
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 1.550
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:
Zitat:
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).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2007, 12:27 Nach oben    #2
Basti
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 745
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.

Zitat:
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).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

« Eclipse mit PDT + XAMPP mit Xdebug | [PHP] PHPUnit oder testgetriebene Entwicklung »

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

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge anzufügen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zum Tut: [PHP] Fremde Webseiten auslesen the_cRu PHP-Programmierung 27 10.02.2007 19:59
[PHP] FTP-Funktionen in PHP nutzen MrNiceGuy Tutorials 0 24.05.2006 14:18
[PHP] Formulare verstehen und auswerten WarrenFaith Tutorials 5 21.03.2006 17:11
[PHP] Datenbank-Backup mit mysqldumper Jann Hendrik Tutorials 0 16.03.2006 08:58
[PHP] Ein einfaches Template-System MrNiceGuy Tutorials 0 09.10.2005 18:30


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:28 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.6.7, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

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