An informative post by rmwebs that I'll put here for more exposure.
I have my doubts about the informative nature of that particular post. The glaring things that pop out to me:
1) Hashing is a different problem than encryption. With RSA or AES, you still have a key floating around. You don't use it for one-way encryption (AES is reversible with the key you encrypted with!), and you
never use two-way encryption on passwords. You don't want the plaintext recoverable.
Ever. Encrypting the hashes may slow things down a bit, but only in the sense that the attacker will now be rooting around your server for the encryption key as well. And if you use RSA as one-way encryption, it's no better than a weak hash around your hash. You gain nothing other than the complexity of your own security model, which may introduce vulnerabilities and bugs that reduce the overall security of the system.
2) MD5/SHA1 are cracked in the sense that you can generate a database of collisions. It may or may not actually match the password + salt. So they are cracked for cases where there is no salt (collisions are just as valid as the original string), and as file signatures, since it has been shown that MD5 hashes of files can indeed be forged by matching the hash with different content. When it comes to passwords, they are weak because of how quickly you can hash them. A more complicated and cryptographically secure hash will take longer to hash, meaning an attacker can try fewer keys per second against the hash.
He is wrong that MD5/SHA1 are reversible,
unless you don't use salt.
2) The real solution is using
PBKDF2 hashing algorithms or similar. Which incidentally, isn't terribly different from bcrypt's implementation of hashing. So he's right there. But the goal here is to slow down dictionary attacks and the like long enough so that users can change their passwords. The problem here is that if they have the hash, it really is just a matter of time before it can be broken, even if it is on the order of months.