警告:自从这篇文章写于 2010 年以来,GPU 已被广泛用于暴力破解密码哈希。价格适中的 GPU每秒可以运行100 亿个 MD5。这意味着即使是完全随机的 8 个字符的字母数字密码(62 个可能的字符)也可以在 6 小时内被暴力破解。SHA-1 只是稍微慢一点,需要一天时间。您的用户密码要弱得多,并且(即使使用加盐)将以每秒数千个密码的速度下降。散列函数被设计为快速。您不希望将其用于密码。使用 scrypt、bcrypt 或 PBKDF-2。
MD5早在 1996 年就被发现很弱,不应再用于加密目的。SHA-1是常用的替代品,但也有类似的问题。SHA-2系列哈希函数是当前SHA-1的替代品。SHA-2 的成员分别称为 SHA-224、SHA-256、SHA-384 和 SHA-512。
目前,一些散列函数正在竞争成为SHA-3,下一个标准化的加密散列算法。获胜者将在 2012 年选出。这些都不应该使用!
对于密码散列,您还可以考虑使用bcrypt 之类的东西。它的设计速度足够慢,以使大规模暴力攻击不可行。您可以自己调整慢速,这样当计算机变得更快时,它可以变慢。
警告: bcrypt 基于较旧的双向加密算法 Blowfish,目前存在更好的替代方案。我不认为 bcrypt 的加密散列属性被完全理解。如果我错了,请有人纠正我;我从来没有找到一个可靠的来源从密码学的角度讨论 bcrypt 的属性(除了它的缓慢性)。
冲突风险对于密码散列的重要性不如对公钥密码学或数字签名的重要性,这可能有点让人放心。今天使用 MD5 对于 SSL 来说是一个糟糕的主意,但对于密码散列来说却不是同样灾难性的。但是,如果您有选择,只需选择一个更强大的。
使用良好的散列函数不足以保护您的密码。您应该将密码与长且加密随机的盐一起散列。如果可能,您还应该帮助您的用户选择更强的密码或密码短语。越长越好。