Heute dachte ich mir, es schadet nicht zwischendurch auch mal ein paar Basics zu zeigen. Die müssen/mussten wir alle lernen
Wie der Titel verrät, möchte ich auf das Thema Passwörter für Datenbanken eingehen.
Welche Möglichkeiten habe ich?
Gibt es Vorteile? Nachteile?
Keine Verschlüsselung
Vorteile:
- Wenn ein Benutzer das Passwort vergessen hat, kann man Ihm das original zuschicken. (fällt euch was auf? wenn nicht, ich gehe gleich darauf ein
)
Ja das wars dann auch schon mit den Vorteilen.
Nachteile:
- Das Passwort steht unverschlüsselt in der Datenbank
- Jeder der zugriff auf die Datenbank hat (sei es du selbst oder ein Angreifer), kann das Passwort als klartext anschauen.
- Unseriös! Wenn eine Internetseite mir das original Passwort zusenden kann, kann er es auch selber lesen. Und mal ehrlich, wieviele Menschen benutzten überall das selbe Passwort?
Base64
Base64 kodiert einen String.
Beispiel:
$str = 'Dies ist ein zu kodierender String'; echo base64_encode($str); // ausgabe: RGllcyBpc3QgZWluIHp1IGtvZGllcmVuZGVyIFN0cmluZw==
Damit kann ich also den kodierten String in der Datenbank speichern.
Das Problem ist, dass man den kodierten String auch wieder dekodieren kann.
Beispiel:
$str = 'RGllcyBpc3QgZWluIHp1IGtvZGllcmVuZGVyIFN0cmluZw=='; echo base64_decode($str); // ausgabe: Dies ist ein zu kodierender String
Vorteile:
- Passwort ist kodiert in der Datenbank
- Wenn ein Benutzer das Passwort vergessen hat, kann man Ihm das original zuschicken.
Nachteile:
- Das Passwort ist “nur” kodiert in der Datenbank
- Jeder der zugriff auf die Datenbank hat, kann das Passwort kopieren und dekodieren!
- Unseriös!
- Verbraucht etwa 30% mehr Speicherplatz
base64_encode auf php.net
base64_decode aud php.net
MD5-Hash
Bei einem MD5-Hash handelt es sich um eine einwegverschlüsselung. Das heißt, wenn man es einmal verschlüsselt hat, kann man es nicht mehr entschlüsseln.
MD5 erzeugt einen 32 Zeichen langen Hexadezimalstring.
Vorteile:
- Der Hash hat immer eine Länge von 32 Zeichen
- Das Passwort ist verschlüsselt in der Datenbank
- Seriösität, da man ein neues Passwort zugeschickt bekommt und nicht das Original.
- Wenn jemand zugriff auf die Datenbank hat, sieht er nur den MD5-Hash und kann ihn nicht entschlüsseln. (Brute-Force lassen wir hier mal außen vor)
Nachteile
- Man muss ein neues Passwort an den Benutzer schicken. (Ich hatte schon Benutzer die deswegen gemeckert haben. Die wollten das original Passwort haben.)
- Da ein MD5-Hash auf 32 Zeichen begrenzt ist, gibt es eine begrenzte anzahl an kombinationen. (16^32
Ok, das ist nicht wirklich ein Nachteil)
Beispiel:
$str = 'itzliwutzli'; echo md5($str); // ausgabe: 0f2effb549decd5dae1f66931d5cfbaf
Die ganz klare Entscheidung sollte also MD5 sein. (MD5 bei php.net)
Sobald der MD5-Hash in der Datenbank ist, vergleicht man das Passwort nur noch als MD5-Hash mit dem in der Datenbank.
Es gibt natürlich noch weitere Wege, aber das sollte fürs Verständis reichen.
Ein Artikel, wie man einen Login realisieren kann, kommt demnächst dann auch.