Passwörter sicher speichern

2 | 37279 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "Passwörter sicher speichern" mit Ihrem Wissen!

Anzeige Hier werben

Passwörter sollten niemals im Klartext gespeichert werden. Fallen die Benutzerdaten in falsche Hände, können diese missbräuchlich genutzt werden - besondere Gefahrt entsteht durch den Umstand, dass viele Benutzer ein Passwort mehrfach einsetzen. Passwörter sollten in jedem Fall sicher gespeichert werden.

Um die gespeicherten Passwörter für Fremde nutzlos zu machen, verschlüsselt man diese oder generiert einen Hash-Wert.

Verschlüsseln

Das Passwort wird mittels eines geheimen Schlüssels (Zeichenkette) verschlüsselt. Nachteil: Zum Entschlüsseln benötigt man immer zwingend den Schlüssel. Bekommt der Angreifer diesen Schlüssel in die Hände, hat er Zugriff auf alle Passwörter. Gerade weil der Schlüssel auf dem Server selbst hinterlegt sein muss, kann es für Angreifer ein einfaches sein den Schlüssel zu erhalten und für seine Zwecke zu missbrauchen.

PHP bietet zum Ver- und Entschlüsseln unter anderem die Funktion mcrypt(). Diese Funktion unterstützt eine Vielzahl von Algorithmen.

Hashing

Kollisionen

Von einer Kollision spricht man, wenn zwei Daten denselben Hash-Wert erzeugen. Nur über den Hash lässt sich dann nicht mehr erkennen, dass die Eingaben unterschiedlich waren.

Bei allen Hash-Algorithmen treten möglicherweise Kollisionen auf. Ein Hash-Algorithmus gilt dann als unsicher, wenn sich Kollisionen einfach rechnerisch erzeugen lassen.

Ist das möglich kann man ein gültiges Passwort zu einem hinterlegten Hash erzeugen ohne das wirkliche Passwort zu kennen.

Für das Passwort (beliebig lange Zeichenkette) wird ein Hash-Wert mit einer festen Zeichenlänge generiert. Dieser Hash-Wert lässt sich nicht mehr in das ursprüngliche Passwort umwandeln. Um den Benutzer zu authentifizieren, vergleicht man nun den Hash-Wert des eingegeben Passworts mit dem in der Datenbank gespeicherten.

Zur Erstellung eines Hash-Wertes gibt es verschiedene Algorithmen. Hier eine kleine Auswahl:

  • md5 Weit verbreitet aber gilt als nicht mehr uneingeschränkt sicher da sich Kollisionen erzwingen lassen.
  • SHA-1 auch hier gibt es inzwischen Techniken um Kollisionen zu erzeugen, allerdings ist es aufwendiger als bei md5. Es ist daher besser eine der stärkere SHA-Varianten zu verwenden.
  • SHA-224/256/384/512 Die Zahl steht für die Länge des Hash-Wertes in Bit. Da der Hash somit umfangreicher wird, sinkt die Gefahr von Kollisionen. Diese Methode des Hashings ist daher für das Speichern sicherer Passwörter zu empfehlen.

PHP stellt einige Hashing-Funktionen zur Verfügung. Die vielseitigste ist hash(), welche ab PHP 5.1.2 verfügbar ist. In älteren PHP-Versionen kann man diese Funktion per PECL-Extension (PECL hash) nutzen. hash_algos() gibt ein Array mit den verfügbaren Hashing-Algorithmen zurück.

Beispiel  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php

// Erzeugung von Passwort-Hash
$password = "geheim";
$hash = hash('sha256', $password);
echo $password . ' : ' . $hash;

// Prüfung (beispielhaft)
$hash = get_user_hash($_POST['username']); // Fiktive Funktion um Hash aus der Datenbank zu laden
if ($hash == hash('sha256', $_POST['password'])) // Prüfung ob Passwort stimmt
{
     echo "Passwort stimmt überein";
}

?>

Salted Hash

Aber auch wenn man das Passwort als Hash-Wert in der Datenbank speichert ist dieses noch nicht ausreichend gegen Angreifer geschützt. Denn mittlerweile gibt es umfangreiche Rainbowtables. Diese enthalten tausende von Hash-Werten mit den dazugehörigen Zeichenketten, so dass man dort mit etwas Glück fündig wird. Gleichzeitig gibt es inzwischen sogar Suchmaschinen, die nach Hash-Werten suchen können. Für allgemein gängige Passwörter reicht also ein normaler Hash nicht aus.

Die Lösung für dieses Problem nennt sich "Salted Hash". Dem Passwort wird etwas "Salz" in Form einer Zeichenkette hinzugefügt. Passwort und "Salz" können beliebig kombiniert werden. In folgendem Beispiel wird die Benutzer-ID an das Passwort angehängt und daraus der Hash-Wert berechnet.

Beispiel  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

// Funktion die Passwort mit Hash kombiniert und den so erzeugten hash zurückgibt
function saltPassword($password, $salt)
{
     return hash('sha256', $password . $salt);
}

// Erzeugung von Passwort-Hash mit Salt
$password = "ganz_geheim";
$userID   = 5121; // Die UserID dient hier als einfache Möglichkeit für den Salt (hier als Beispiel 5121)
$salt = $userID;
$saltedHash    = saltPassword($password, $salt);
echo $password . ' : ' . $saltedHash . ' (Salt: ' . $salt . ')';

// Prüfung (beispielhaft)
$saltedHash = get_user_hash($_POST['username']); // Fiktive Funktion um salted Hash aus der Datenbank zu laden
$salt = get_user_id($_POST['username']); // Fiktive Funktion um UserID abzurufen
if ($saltedHash == saltPassword($_POST['password'], $salt)) // Prüfung mit Salt
{
     echo "Passwort stimmt überein";
}

?>

Wichtig ist natürlich, dass auch der Salt im Benutzerdatensatz gesichert wird. Ansonsten wäre es später nicht möglich das Passwort zu prüfen. Im Beispiel wird einfach die User-ID als Hash verwendet, zu empfehlen wäre aber das zufällige Erzeugen eines zufälligen Salts. Beispielsweise können zwei bis vier zufällige Zeichen verwendet werden.


Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 7 Personen an der Seite "Passwörter sicher speichern" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Passwörter sicher speichern" hier bearbeiten.