Nice blog post from f-secure that explains why using salts to protect our passwords from rainbow tables is not enough.

As a quick resume, the idea behind the blog post is that using salts with hash algorithms like MD5 or SHA* is not enough, because these algorithms are meant for computing speed. Thus, using several GPUs to brute force all the passwords may take only few days.

A possible option to make it more difficult is to use algorithms that are more complex, reducing the number of attempts per second.

The following schemes are recommended:

Furthermore:

So if you are working with passwords, pick one of the schemes above, determine the number of iterations it takes your server check the password for the desired length of time (10, 200ms, et cetera) and use that. Have a unique salt value and iteration count for each user — anything that forces the attacker to focus on each account separately rather than being able to try against all accounts on each iteration.