Sichere verschlüsselte Passwörter mit Salt

Jeder Programmierer und WebDeveloper stellt sich beim Programmieren die Frage der Sicherheit seiner Daten und der seiner Nutzer. Grade für ein seriöses Unternehmen, egal ob klein ob groß, gibt es keinen größeren Supergau als das interne Daten, Nutzerdaten mit Passwörtern in die Hände Fremder gelangen. Klar, man sollte dies von vorneherein schon ausschliessen können und müssen, aber man kann auch in php mit wenig Aufwand zum Beispiel die Passwörter seiner Nutzer besser schützen. Das sollten einem die Kunden/Nutzer doch wert sein.

Meistens werden die Passwörter mit md5 verschlüsselt. Wer seine Passwörter in reinem Klartext in der Datenbank speichert, der sollte dies schleunigst ändern. Doch auch md5-Hashs können mit Hilfe von Rainbow-Tables entschlüsselt werden. Dafür braucht man noch nichtmal viel Zeit und Geschick, es gibt einige Seiten im Netz, md5-Hash eingeben und das Passwort wird dir  meist fast sofort ausgegeben.

Wie kann man seine Kunden also schützen?

Eins vorweg. Eigentlich sind ja die Nutzer schuld. Zu einfache, zu kurze Passwörter. Meistens Wörter aus dem Duden, fast keine Unterscheidung zwischen Groß-und Kleinschreibung und auf vielen Seiten die gleichen Passwörter. Aber sein wir doch mal ehrlich. Wer soll sich schon D?xj&:78qKz( merken können? Ich kann es auch nicht, da bin ich ehrlich. Also müssen wir Programmierer unseres dazutun, damit die Nutzerdaten dennoch geschützt sind.

Aus diesem Grunde salte ich bei meinen Arbeiten/eigenen Projekten die Nutzerdaten immer. Ein salt ist eine Zufallszahl, die man an das Passwort dranhängt, um das dekodieren des Passworts zu verhindern erschweren. Ich generiere also jedesmal ein Salt von n-Länge und hänge dieses an den md5-Hash des Passwortes an und verschlüssele dieses wieder mit md5. Häh? Hier mal im Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//Funktion um den Salt zu erzeugen mit variabler Länge
function erzeugeSalt($Laenge) {
for ($i=0;$i<$Laenge;$i++) {
$ZufallString1 = "";
//Zeichen die im String vorkommen sollen
$Auswahl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456
789?}]{[%$§&!?ß"
;
$Zufall = substr( str_shuffle( $Auswahl ), 0, 1 );
$salt = $salt.$Zufall;
}
return $salt;
}

// n-stelligen Zufallscode erzeugen in diesem Fall 10 Zeichen
$salt = erzeugeSalt(10);
$pass = "Hier das Userpasswort";
$cryptedPasswort = md5($salt.md5($pass));
?>

Hiermit sollte man auf der sicheren Seite sein. Man speichert nun also den $salt sowie das $cryptedPasswort in der Datenbank und vergleicht dann die Eingabe des Nutzers indem man ihn wieder zuerst mit md5 verschlüsselt, den Salt anhängt, diesen dann verschlüsselt mit md5 und dann mit dem in der Datenbank stehenden md5-Hash abgleicht. Klingt kompliziert, ist aber ganz einfach und logisch und man ist auf der sicheren Seite.

Nun jedes einzelne Passwort zu knacken würde bei jedem Passwort eine Bruteforce Attack mit dem Salt benötigen und das dauert. ;-)


Ein Kommentar, und Du?

  1. Adele sagt:

    Learning a ton from these neat atcriels.

Hinterlass einen Kommentar!

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Wir freuen uns über jeden Kommentar bzw. jede Anregung in unserem Blog. Wir möchten Dich jedoch bitten, freundlich zu bleiben. Bitte beachten: Spamkeywordlinks werden von uns direkt gelöscht.