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.
Eine Grundsatzüberlegung:
-
Jede Art von Passwortschutz bietet niemals eine absolute, sondern immer nur eine probabilistische Sicherheit: Dass jemand das Passwort rät oder sonstwie den Schutz aushebelt, ist *hinreichend*unwahrscheinlich*[1].
-
Ein guter Hash-Algorithmus muss[2] leisten, dass das Finden eines(!) Urbildes eines gegebenen Hashs durch einen Angreifer hinreichend unwahrscheinlich[1] ist. Sonst kann man ihn in den Müll werfen.
-
SHA-512 leistet das (nach jetzigem Stand der Dinge).
-
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].
Alles weitere steht schon im Archiv.
[1] in irgendeinem vernünftigen Sinne
[2] je nach Verwendung ist das u.U. nicht mal notwendig
Viele Grüße,
der Bademeister