PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hashing bei MySQL - Die Password() Funktion



Lidloses_Auge
10.04.2009, 00:48
Manche von euch werden sie schon desöfteren gesehen haben,
beim durchforsten der Spalte “password” in der MySQL Datenbank.
Hashes in der Form

378b243e220ca493

oder auch

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

2 Hashes, die denselben String zum Ursprung haben, nämlich “test”.
Doch wieso kann es vorkommen, dass man manchmal nur kurze, und ein anderes
Mal nur lange Hashes bekommt?

Die Antwort liegt in der Version von MySQL.

Generell werden die Hashes in MySQL mit der Password() Funktion generiert
und kommen bei Paneln wie phpmyadmin zum Einsatz, wenn ein Login gefordert wird.
Das Hashing Verhalten hat sich ab MySQL Version 4.1 verändert, und
ich möchte nun kurz aufzeigen, welche Unterschiede es gibt, und ebenso auch welche Problematiken dabei auftreten können.

Kennwort Hashing bei MySQL < 4.1:
Ein Beispiel Hash der alten Password Funktion finden wir in der Einleitung.
Es handelt sich um den kürzeren der beiden Hashes, der nur eine Länge von 16 Bytes
aufweist. Beim Aufruf der Password Funktion mit dem gewünschten Passwort als Parameter
wird bei Versionen unter 4.1 automatisch der 16 Byte lange Hash generiert.

Kennwort Hashing bei MySQL >= 4.1
Bei den Versionen ab 4.1 kommt der längere Hash ins Spiel.
Es fällt deutlich auf, dass dieser nun 41 Bytes lang ist,
dementsprechend auch wesentlich bessere Kryptographische Eigenschaften
aufweist, und in jedem Fall mit einem Sternchen beginnt, woran
man diesen Hash Typ auch direkt erkennen kann.
Ein MySQL System ab 4.1 ist in der Lage beide Hashes zu generieren,
und ist daher abwärtskompatibel.
In der Regel wird hier beim Aufrufen der Password Funktion samt Parameter
der lange Hash generiert, doch hier gibt es einige Ausnahmen.

Ausnahme 1:
Die erstellten Hashes werden in der password Spalte gespeichert.
Ist diese 41 Bytes lang, können die neuen Hashes generiert werden.
Weist die Spalte jedoch nur eine Länge von 16 Bytes auf, ganz gleich
welche MySQL Version verwendet wird, kann nur ein kurzer Hash
erstellt werden.
Dies kann zum Beispiel passieren, wenn man ein Update auf eine Version
< 4.1 spielt, und im Anschluss daran, das Skript "mysql_fix_privilege_tables"
nicht ausführt, welches zur Verbreiterung der Password Spalte dient.

Ausnahme 2:
Um eine Verbindung mit einer alten MySQL Version herstellen zu können, muss
man die alten Hashes nutzen, macht sich also die Abwärtskompatibilität zu Nutzen.
Ruft man mit einer MySQL Version >= 4.1 die Password Funktion auf, wird zwar ein
großer Hash generiert, doch ist es möglich die Option “–old-passwords” nachzuschalten,
die ein Erstellen der kurzen Hashes erzwingt.

Welche Hash Funktion ist zu empfehlen?

Grundsätzlich gilt natürlich, dass der 41 Byte lange Hash sicherer in der Anwendung ist,
doch gilt es zu beachten, in welcher Umgebung sich das System befindet.
Sind alte MySQL Systeme in der Umgebung, gilt es zu beachten, dass man zur Authentifizierung
kurze Hashes verwenden muss.
Sind im Netzwerk jedoch ausschließlich neuere Versionen zu finden, ist selbstverständlich
auch der lange Hash zu empfehlen.

Weitere lesenswerte Informationen zu MySQL findet man in der ausführlichen Dokumentation.

In dem Sinne, Happy Hashing.

Quelle: http://www.novusec.com


Lidloses_Auge