PHP-Einfach.de PHP lernen leicht gemacht

Navigation
» Startseite
» Newsübersicht
» Kontakt
» Impressum

Community
» Forum
» Gästebuch

Tutorial
» PHP Tutorial
» MySQL Tutorial
» PHP
» MySQL
» Codeschnipsel

Downloads
» Einführung
» Scripts
   » Clanbook
   » Clanletter
» Command Board

Sonstiges
» md5-Generator
» Generator
» Wissenswertes

PHP lernen


Dieses Projekt wird unterstützt von
Lichteffekte Shop

 
Partner:
Mathe Nachhilfe
Suchmaschinenoptimierung
PHP Forum

Improved Hash Algorithm

Improved Hash Algorithm 1.0 herunterladen (13 KB)

Immer wieder liest man, dass in irgendwelche Datenbanken eingebrochen wurden und dort die Kundendaten gestohlen wurden.
Zu diesen Kundendaten gehört normalerweise auch ein Passwort und da viele Nutzer leider ein schlechtes Passwort für mehrere Dienste verwenden, kann es für diese sehr unangenehm werden, wenn das Passwort aus einer Datenbank gestohlen wurde.

Deswegen ist es ein gängiges Konzept, sein Passwort als Hashwert abzuspeichern, als Hashalgorithmus wird oft auf MD5 oder SHA1 zurückgegriffen.
Dieser Hashalgorithmus ist eine sogenannte Einwegfunktion, d.h. es erstellt aus einem Passwort einen Wert, den man nicht 'entschlüsseln' kann.
Ein Angreifer, der solch ein Hashwert in die Hände bekommt, kann nur mit sehr viel Aufwand wieder an das Passwort gelangen, indem er alle möglichen Passwörter ausprobiert und überprüft, ob der gesuchte Hashwert (vom Passwort des Kunden) dabei ist. (mehr dazu unter Was ist md5?)

Leider ist es so, dass viele Benutzer ein sehr schlechtes Passwort wählen. Entweder ist es viel zu kurz oder es ist einem Wörterbuch zu finden.
Ein Angreifer der nun an die Kundendaten gelangt ist und somit auch die Hashwerte der Passwörter besitzt, kann in relativ kurzer Zeit erstaunlich viele Passwörter knacken und damit weiteren Schaden anrichten. Selbst zufällige Passwort mit nur 8 oder 9 Zeichen lassen sich oft schnell knacken.

Um diese Gefahr zu reduzieren gibt es ein paar Techniken die man verwenden kann, z.B. ist es sinvoll eine sogennante Salt zu verwenden um Wörterbuchattacken zu verhindern, allerdings ist soetwas meistens noch nicht ausreichend.

Unser Improved Hash Algorithm versucht aus einem schwachen Passwort ein starken Hashwert zu berechnen, dies bedeutet, dass dieser Hashwert nur sehr schwer gebrochen werden kann. Somit kann man möglichen Schaden abfangen, wenn die Benutzerdaten gestohlen werden, da es dem Angreifer nur sehr schwer möglich ist, zu den Hashwerten die Passwörter wieder herzustellen.
Die Technik die verwendet wird ist bekannt unter Key strengthening und sie funktioniert wie folgt:

Normalerweise verwendet man z.B. md5() nur einmal auf das Passwort an und speichert dann den Hashwert in der Datenbank.
Aktuelle Computer schaffen rund 20 bis 40 Millionen Passwörter pro Sekunde zu überprüfen, sprich ein schlechtes Passwort kann sehr schnell gebrochen werden.

Aber was ist, wenn das Script zweimal die Funktion md5() aufruft, in etwa so?
<?php
$hash = md5(md5("Passwort"));
?>

Ein protenzieller Angreifer müsste dann für jedes Passwort das er testet auch zweimal den Hashwert berechnen, womit er dann z.B. nicht mehr 20 Millionen Passwörter pro Sekunde testen kann, sondern nur noch 10 Millionen. Er würde also ca. doppelt solange benötigen um das Passwort zu knacken.
Dies kann man weiterspinnen, was ist wenn ich dreimal, viermal oder sogar hundertmal md5() Aufrufe? Genau, der Angreifer bräuchte dann auch drei-, vier- oder sogar hundertmal solange um das Passwort zu knacken.
Wenn er vorher also 1 Tag gebraucht hätte, um das Passwort des Benutzers zu knacken, braucht er jetzt 100 Tage, was sich für ihn vermutlich wenig lohnt.

Wie wäre es, wenn ich tausend- oder sogar eine Millionen mal md5() auf das Passwort anwende? Er bräuchte dann immerhin 1 Millionen Tage um das Passwort zu knacken.

Natürlich kann man dies machen, aber man muss bedenken, je häufiger man md5() aufruft, umsolänger dauert es auch für uns, bis wir den Hashwert für den Benutzer berechnet haben, also bis sich der User einloggen kann. Da PHP vergleichsweise leider langsam ist, könnte es mehrere Sekunden dauern bis wir eine Millionen mal md5() aufgerufen haben, was nicht akzeptabel ist.
Deswegen muss man hier einen Kompromiss finden, aber ein Wert zwischen 1000 und 10 000 ist vertretbar, PHP benötigt dafür nur hundertstel Sekunden.

Wie sieht sowas nun in PHP aus?
Ganz einfach, z.B. so:
<?php
$passwort = md5("geheim);
for($i=0;$i<1000;$i++)
  $passwort = md5($passwort);

echo $passwort;
?>



Natürlich besteht hier weiterhin die Gefahr von Wörterbuchattacken, deswegen muss man unbedingt auch eine Salt verwenden.

Hört sich alles ganz schön umständlich an?
Genau hierfür gibt es unseren Improved Hash Algorithm.

Ein einfaches Beispiel wie man ihn verwendet sieht z.B. so aus:
<?php
require("iha.php");
$iha = new iha();
$pw = "geheim";

//Hashwert berechnen um diesen dann abzuspeichern
$hash = $iha->hash($pw);

echo "Password: ".$pw." <br>Hash-Value: ".$hash."<br><br>";

if($iha->compare($pw, $hash))
   echo "Password ok";
else
   echo "Falsches password";
?>

Wie funktioniert Improved Hash Algorithm genau?
Ein typischer Hashwert des Improved Hash Algorithm kann z.B. so aussehen:
AAAJxA;2Rd/Ts;3qwiKTWppNtb2M4nhDrmyA==

Der Hashwert ist durch das Semikolon in drei Felder unterteil, das erste Feld (der Header) enthält Informationen welche Einstellungen verwendet wurden, unter anderem welcher Hashalgorithmus verwendet wurden, hier stehen MD5 und SHA1 zur Auswahl, sowie, wie oft dieser Hashalgorithmus angewendet wurde.
Das zweite Feld enthält die zufällige Salt, sie ist somit einem Angreifer bekannt, welches aber weiter nicht schlimm ist.
Das letzte Feld enthält nun endlich den Hashwert unseres Paswortes.

Um diesen Hashwert zu berechnen kann man entweder auf (standardmäßig) MD5 oder auch auf SHA1 zurückgreifen, dann wird diese Hashfunktion (md5() bzw sha1()) entsprechend oft aufgerufen. Die Standardeinstellungen hier für sind 2500 Wiederhohlungen.
Selbstverständlich wurde auch eine zufällige Salt zur Berechnung des Hashwertes mit einbezogen.

Also besonderes Extra kann man dem Improved Hash Algorithm noch ein geheimes Passwort übergeben und nur wer dieses Passwort kennt, kann auch überprüfen ob ein Passwort zu einem Hashwert passt.
Ein Angreifer könnte so erstellte Haswert nicht knacken (sofern das Passwort lang genug ist), sondern er müsste auch an das Passwort für den Improved Hash Algorithm gelangen.
Aber Achtung! Solltes dieses Passwort verloren gehen, können wir selber nicht mehr verifizieren, ob ein Benutzer ein richtiges Passwort angegeben hat.



Download:
Improved Hash Algorithm 1.0 herunterladen (13 KB)





Autor Andavos

News
13.08 - » Spam im Gästebuch
Endlich Schluss mit dem Spam

08.12 - » Clanletter 2.0
Clanletter wurde komplett neu programmiert

01.09 - » Command Board 1.0 - 2.0
Das Command Board 1.0 Beta 2.0 ist erschienen


Mehr

Forum
» Prinzip des Kampfsystemes kurz un ...

» Facebook Connect

» Geometrische Formen verlinken







© PHP-Einfach.de 2003 - 2010