Der Trick ist eine Hashfunktion zu wählen die viel Power benötigt.
Also eben eine wie bcrypt oder scrypt. Es ist generell ein Fehler, so etwas selbst zu entwerfen.
Hier gibt es übrigens eine (
imho gute)
Übersicht über die Verfahren.
Troy Hunt hat das Problem mal am ASP.NET Membership Provider verdeutlicht. Lesenswert und sehr anschaulich.