我觉得我应该评论一些作为回复发布的声明。
首先,速度确实是一个问题,尤其是 MD5,也包括 SHA1。我写了自己的 MD5 暴力破解应用程序,仅仅是为了好玩,并且仅使用我的 CPU,我可以轻松地将一个哈希值与大约 2 亿个哈希值/秒进行比较。这种速度的主要原因是,对于大多数尝试,您可以绕过 64 个步骤中的 19 个步骤。对于更长的输入(> 16 个字符),它将不适用,但我相信有一些方法可以解决它。
如果您在网上搜索,您会看到有人声称能够使用 GPU 每秒比较数十亿个哈希值。我毫不奇怪,如今仅在一台计算机上就能达到每秒 1000 亿次。这只会越来越糟。它将需要一个使用 4 个双高端 GPU 或类似东西的耗电大户,但这仍然是可能的。
以下是每秒 1000 亿次成为问题的原因
假设大多数密码包含 96 个字符的选择。一个包含 8 个字符的密码将有 96^8 = 7,21389578984e+15 个组合。
如果每秒 1000 亿次,那么需要 7,21389578984e+15 / 3600 = 大约 20 个小时才能弄清楚它实际表示什么。请记住,您还需要添加 1 到 7 个字符的数字。如果您想针对单个用户,20 个小时不算太长。
所以本质上
有充分的理由说明为什么较新的哈希算法是专门设计为不容易在 GPU 上实现的。
哦,我看到有人提到 MD5 和彩虹表。如果您阅读了这里的数字,我希望您意识到彩虹表在 MD5 方面已经变得多么愚蠢和无用。除非 MD5 的输入非常大,否则您将无法与 GPU 竞争。当存储介质能够产生远远超过 3TB/秒的速度时,CPU 和 GPU 将会达到更高的速度。
至于 SHA1,我认为它比 MD5 慢大约三分之一。我无法自己验证这一点,但根据 MD5 和 SHA1 的数字来看,情况似乎就是这样。速度问题在这里基本上与 MD5 非常相似。
这里的道德
请按照指示操作。永远不要再使用 MD5 和 SHA1 来哈希密码。我们都知道大多数人的密码不会很长,这是一个主要缺点。添加长的盐肯定会有所帮助,但除非您想添加几百字节的盐,否则会有快速暴力破解应用程序可以逆向工程您的密码或用户的密码。