Moin Moin!
Umständlich, aber nicht sicherer. Gegen Rainbow-Tables hilft der Ansatz, das Passwort zu verwursten, allerdings wird das Ergebnis nicht besser:
Du verteilst die 8 Bit jedes Zeichens auf 128 Bit einer MD5-Summe, aber trotzdem bekommst Du nur 256 verschiedene MD5-Summen. Und weil die bei PHP als hexadezimale Zahlen aus der MD5-Funktion herausfallen, sind in dem String sehr viele Bits konstant 0 oder konstant 1. Die zehn dezimalen Ziffern unterscheiden sich nur in 4 Bit, die sechs zusätzlichen Buchstaben sogar nur in 3 Bit voneinander. Das Zusammenkleben der einzelnen MD5-Summen erzeugt so zwar eine große Menge Bits, die sind aber überwiegend konstant. Damit wird die Ergebnismenge der finalen MD5-Summe KLEINER, die Wahrscheinlichkeit für Kollisionen STEIGT also.
Und für gleiche Passworte spuckt diese sinnfreie Verbrennung von Rechenleistung immer noch gleiche MD5-Summen aus.
Best Practice / Stand der Technik ist SHA512 mit einem zufälligen Salt-Wert pro Benutzer, irgendwann in naher Zukunft wird es eine andere Hash-Funktion gebeb, die SHA512 überlegen ist. Wenn Du nicht SEHR, SEHR viel Erfahrung mit kryptographischen Hashfunktionen hast (und damit ist die Entwicklung solcher Funktionen gemeint und nicht ihre Nutzung), solltest Du Dich daran halten, statt selbst irgendetwas zusammenzufrickeln, was am Ende noch viel angreifbarer ist als ungesalzenes MD5.
Noch besser wäre natürlich, zugunsten von Public-Key-Verfahren auf Passworte komplett zu verzichten. Das ist im Web-Umfeld allerdings noch nicht wirklich praktikabel.
Leseempfehlung: http://aktuell.de.selfhtml.org/weblog/php-verschluesselung-100-euro-wette (Ja, da geht es um Verschlüsselung, nicht um Hash-Funktionen. Beide sind aber mathematisch ausreichend eng verwandt, um daraus auch für Hash-Funktionen eine Lehre zu ziehen.)
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".