SHA-512 w/ per User Salts is Not Enough
blog.mozilla.com
blog.mozilla.com
And as for why this scheme is bad: your application has access to this "protected file" with secret shared key and so does attacker.
Treating any part of a user password scheme as secret is doing it wrong. This is why bcrypt exists.
The author does not understand that salts primarily protect against rainbow tables (pre-computation attacks). He assumes the purpose is to increase brute force search complexity or somehow add additional secrecy, and is correct that it fails at both.
If you are already using user specific salts and a strong SHA hash, the next place you should be looking to add security is increasing the number of rounds (i.e. sha(sha(sha(hash+pass)))) or switching to bcrypt (which takes advantage of an expensive key setup phase in blowfish to make brute force searches very painful).
Whenever this topic comes up, this link should be posted: http://codahale.com/how-to-safely-store-a-password/
Also, rainbow tables do matter. If you don't protect against them, they immediately become effective again. Your argument is "bump keys exist for locks, better take them off the doors!"
Bump keys exist for locks, lets not rely on them as a strong point for security.HD 6970 = 5.5 billion MD5/s http://golubev.com/gpuest.htm
Isn't this what scrypt/bcrypt/etc. are designed for?
Also when much of this started we didn't have hardware that could brute and entire database of hashes within hours.
Lastly, laziness.
hash(salt + nonce + password)
gets the same job done. If you don't trust your hash algorithm... pick a new one.
EDIT: It occurs to me that this whole notional improvement (the one from the article and my alternative) isn't as great as it might first seem: if an attacker gets the table of salt+password, and if the attacker knows the password to one account on the system, he can figure out what the nonce is by doing trial hashes using hash(nonce+salt_k+password_k), where salt_k and password_k are the known salts and passwords. In this way, he can figure out the nonce. Since you will very likely run into collisions when attempting to guess the nonce, you will have to have more than one known password, and you probably want to know something more about the nonce, e.g., its length, but fundamentally you're only increasing the difficulty of the attack by a small amount.
EDIT 2: thinking about it more, the right way around this is just to use a gigantic nonce. If your nonce is 1k, good luck brute forcing it. In this case, I'm fairly certain that my proposed alternative is just as sufficient as the original.
It's not that salt is bad so much as that it's insufficient. It's useful to keep straight up rainbow tables from working and to be sure that two users with the same password don't end up with the same value in the password table.