You are not logged in.

This articles has been requested to be deleted.

This articles has been flagged as inappropriate.

Wednesday, February 3rd 2010, 1:42am

Tags

hash, Mnemonik, Passwort, Streuung, zufall

Abstract

Automatische Passwörter zur Vorabregistrierung werden in jedem Webprojekt benötigt. Hier werden ein paar Verfahren vorgestellt.

Article

Das Verfahren lässt sich für beliebige, eindeutige, kurz, prägnante Zeichenketten verwenden. Es kann auch zum Beispiel für die "Passwort vergessen" Funktion genutzt werden.
An ein gutes Passwort sind aber verschiedene Bedingungen geknüpft.

1. Abwechslung


Kennt einer Angreifer 10 Passwörter, sollte man daraus nicht das 11te schließen können. Zwischen den Passwörtern darf es keine Gemeinsamkeit geben.
Dazu gibt es in PHP die Funktion rand(). Sie liefert eine Zahl.

PHP Quellcode

1
2
$random = rand();
echo $random; //1807510776


Die Funktion hat einen kleinen Wertebereich. Um die Zahl 1807510776 zu knacken bräuchte man nur 1807510776 Loginversuche.

PHP Quellcode

1
2
3
for($i=0; $i<99999999999; $i++) {
	versuchelogin($i);
}


2. Eindeutigkeit


Die Passwörter sollten "relativ" eindeutig sein - es liegt auf der Hand, dass ein Passwort, dass von jedem Benutzer verwendet wird, kein gutes ist.
Welche Funktionen gibt es um dies in PHP zu erreichen? Eine Handbuchrecherche nach unique liefert uns die Funktion uniqid.
Dieser löst auch gleich das Problem mit dem kleinen Wertebereich. Sie setzt statt dem Dezimal- auf dem Hexadezimalsystem auf und hat außerdem eine andere Größe.

Die Methode besitzt folgende Signatur:

Source code

1
string uniqid  ([ string $Präfix  [, bool $mehr_entropie  ]] )

Das Handbuch verspricht, dass die Rückgabe der Funktion durch den Parameter $mehr_entropie noch eindeutiger wird. Als Präfix nehmen wir die Zufallszahl.

PHP Quellcode

1
2
3
$random = rand();
$unique = uniqid($random, true);
echo $unique; //18075107764921ae0bb96c37.27618105


Hierdurch wird eine ID mit 32 Zeichen (ein 128 Bit-Hex-Wert) erzeugt, die nur schwer vorhersehbar ist.


3. Streuung


Streuen bezeichnet in der Informatik das Abbilden großen Quellmenge in eine kleinere Zielmenge. Da dieser Hashwert kürzer als die originale Datenstruktur ist sind Kollisionen prinzipiell unvermeidlich. Eine gute Hashfunktion zeichnet sich aber dadurch aus, dass sie wenige Kollisionen erzeugt.
Eine bekannte Hashfunktion ist md5(). Begrenzen wir die Länge auf eine Anzahl haben wir damit unser erstes zufälliges Passwort:

PHP Quellcode

1
2
3
4
5
6
function simplePassword($length) {
	$random = rand();
	$unique = uniqid($random, true);
	$hash = md5($unique);
	return substr($hash, 0, $length);
}



4. Volles Alphabet


Um den Wertebereich des ganzen Alphabets auszuschöpfen

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
function simplePassword($length) {
	$password = "";
 
	while (strlen($password) < $length) {
		$array[0] = chr(rand(48,57)); // Null bis Neun
		$array[1] = chr(rand(65,90)); // Großbuchstaben
		$array[2] = chr(rand(97,122)); // Kleinbuchstaben
		$password .= $array[array_rand($array)];
	}
 
	return $password;
}



5. Wohlingendes Passwort


Ein Verfahren dass indirekt zu mehr Sicherheit beiträgt ist das Verfahren zum mnemonischen Passwort.
Die Mnemonik ist die Gedächtniskunst. Sie soll mit Regeln, Kniffen und Tricks das Erinnerungsvermögen unterstützen und leistungsfähiger zu machen.
Im realen Leben ist die Eselsbrücke eine bekannte mnemonische Technik.
Natürlich können spezielle Algorithmen Passwörter auf diese Art um einen Bruchteil schneller knacken. Allerdings ist der Aufwand der Anpassung immens groß.

Einen Code für wohlklingende Passwörter findet man unter http://www.mathias-bank.de/2006/08/15/wo…nde-passworter/.

6. Demo


Unter Nutzung des "Vollen Alphabets" habe ich folgende Demo online gestellt: http://demo.easy-coding.de/php/passwords/.
Den Code dazu findet ihr unter http://demo.easy-coding.de/php/passwords/download.zip.

Lexikon 4.1.5, developed by www.viecode.com