Moin Moin!
Hi.
$md5 = hash("md5", 'geheim'.$dbSalt.$staticSalt);
$sha = hash("sha512", 'geheim'.$dbSalt.$staticSalt);in die DB werden nun beide eingetragen.
Beim Login werden beide überprüft.
Was ich damit erreichen will ist, dass selbst wenn man durch Einsatz von Rainbow-Tables ein Passwort finden würde das die selbe md5 Prüfsumme wie mein Passwort "geheim" besitzt immer noch die sha Prüfsumme da wäre.
- Was Du machst, ist Raterei: SHA-512 vertraust Du nicht, SHA-512 + MD5 (also die Konkatenation, d.h. ein 640-Bit-Hash) aber schon. Stell Dir vor, es gäbe schon einen SHA-640. Dann würdest Du ihm wieder nicht trauen und lieber einen SHA-640 + MD5 benutzen, oder? Das ist unsinnig. Wenn Du einen SHA-512 Hashwert speicherst, kannst Du davon ausgehen, dass ein Angreifer, der den Wert hat, kein einziges(!) Urbild davon finden wird, weder durch Raten noch auf andere Weise. Es ist hinreichend unwahrscheinlich[1].
Es ist noch schlimmer: MD5 ist mit überschaubarem Aufwand knackbar, d.h. man findet relativ einfach das Passwort oder ein kleines Set von Passworten mit identischem MD5-Hash. Und dank der zusätzlichen Frickelei mit SHA512 ist es nun extrem leicht zu prüfen, ob das zurückgerechnete Passwort korrekt ist bzw. welches aus dem Set das passende ist -- ganz einfach indem man darüber den SHA512-Hash berechnet und mit dem vorhandenen Sollwert berechnet, das geht auf aktueller Hardware mit lächerlich geringem Aufwand. Ein Angreifer muß sich also gar nicht am härteren SHA512 abrackern. Erleichtert wird dem Angreifer die Arbeit auch noch dadurch, dass MD5 und SHA512 exakt den selben String verarbeiten, mit identischem Salt. Das wäre für die doppelte Passwort-Püfung überhaupt nicht nötig, beide Hash-Funktionen könnten mit unterschiedlichen Salt-Werten arbeiten.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".