是否需要使用 bcrypt 或 scrypt 之类的东西?哈希值存储在数据库中的时间要长得多。使用盐渍 MD5 或 SHA 是否可以逃脱并且仍然安全?
加盐 MD5 或加盐 SHA 是否被认为是安全的?
MD5 和 SHA-1显然是存储密码的糟糕选择。问题不在于它们的抗碰撞性;这是因为它们被设计得非常快。当暴力破解哈希列表时,现代 GPU 每秒可以尝试数十亿次密码。这最多可以在几天内破解所有可能的八位字母数字密码;只有一个 GPU。
bcrypt 和 scrypt 的优点是可以消耗任意多的资源;bcrypt 具有可配置的 CPU 要求,scrypt 具有可配置的 CPU 和内存要求。通过增加这些工作因素,您可以显着增加攻击者在您的数据库中尝试使用单个密码所需的工作量。
至于长度:现在是 2014 年。存储本质上是无限便宜的。每条记录节省 40 字节根本不是选择已知较差的密码散列算法的可接受的借口。在您从事的任何项目中,肯定有比这更有价值的任务来花费您有限的开发资源。
事实上,没有“salted MD5”或“salted SHA-1”这样的东西。MD5和SHA-1是定义明确的哈希函数,它们将(几乎)任意长度的位序列作为输入,并输出固定长度(分别为 128 位和 160 位)的位序列。MD5 和 SHA-1 的定义中没有任何盐分;就此而言,也没有密码。
人们所说的“salted MD5”或“salted SHA-1”实际上是新的加密结构,将一些编码约定(将密码转换为位序列)和盐值(另一个字符或位序列)组合成一个(或几个)散列函数的调用。有很多可能的方法可以做到这一点,而且没有标准。充其量,我们可以拥有一系列设计,这些设计可以归类为通用术语“MD5 with some salt”。在密码学上,这些结构不必彼此等价;有些人可能很穷。
即使假设您的特定“salted MD5”碰巧没有搞砸,您仍然会遇到 MD5(或 SHA-1)的主要问题,那就是速度。速度意味着攻击者每秒可以尝试很多潜在的密码;数字是每秒数十亿(那里的基准)。如果您想使用加盐的 MD5 或 SHA-1 “逃脱”,那么您需要用更多的密码熵来对抗这种速度。不是密码长度,请注意;长度仅与安全性松散相关。添加更多字符无济于事;添加更多攻击者不知道的字符是有帮助的。
实际上,如果您必须使用加盐 MD5 或 SHA-1,那么您必须在每个密码中使用至少 60 位的熵。这是不现实的:普通用户不会产生或记住这样的密码。充其量,如果您的用户达到 30 位熵,您可以认为自己很高兴。换句话说,使用盐渍 MD5 或 SHA-1,您将达不到所需的安全级别十亿左右。这些可能性很小;打个比方,当你的整个军队由一名手持棒球棒的士兵组成时,这类似于试图军事入侵美国。史泰龙失败了。即使是查克·诺里斯也会觉得这很有挑战性。
去阅读这些答案:
去买新盘吧!我的第一个实际硬盘(早在 1991 年)大小为 40兆字节,可以为超过 50 万用户存储 bcrypt 哈希值。你的服务器是 23 年的老硬件,你有超过 50 万的用户吗?如果是这样,那么我向你的勇气致敬,我强烈建议你在医疗救助的情况下去一些庇护所睡觉。否则,“哈希值要大得多”的论点是,没有很好的说法,真的很愚蠢。
好的,有一个可靠的方法可以摆脱使用盐渍 MD5 或 SHA-1。拥有一个如此无趣且没有任何非无聊数据的服务器就足够了,攻击者甚至都懒得攻击它。毕竟,懒惰仍然是宇宙中最强大的力量。
不,你无法摆脱 MD5 或 SHA,而且这个话题真的被讨论到死了。
所有通用哈希算法(如 MD5 或 SHA)都极易受到暴力攻击,因为它们是为速度而设计的。例如,像 HD 6990 这样的旧 GPU 可以使用 oclHashcat每秒计算大约 100 亿个 MD5 哈希和 40 亿个 SHA-1 哈希。
很容易看出,即使是体面的密码也无法在这样的攻击中幸存下来。例如,如果您使用 MD5,搜索所有包含 6 个字母数字字符的密码的整个空间只需要 6 秒。甚至 8 个字符也只需要 6 个小时。添加盐不会改变这一点。虽然盐迫使攻击者单独处理每个哈希,但考虑到性能,这几乎没有什么区别。
散列密码时,您不需要速度。相反,该过程应该非常昂贵且缓慢。这就是为什么需要专门的密码哈希算法,如 bcrypt 和 scrypt。
盐渍 MD5 还不够好。MD5 不是抗冲突的,这意味着攻击者可以想出一个密码来匹配任何给定的哈希值(无论它实际上是否是“正确的”密码)。攻击者不在乎你散列之前的值是什么,包括你做的任何盐渍;他们只需要最终值即可生成有效密码。
另一方面,我相信大多数版本的 SHA(至少 SHA-2 和 SHA-3)仍然被认为是安全的,但我不知道密码存储的最新技术是什么。根据应用程序,您可能希望多次运行它。
编辑-再想一想,如果您将盐与服务器端的帐户相关联,我不确定是否可以反转 MD5 以产生特定的盐。不过,我很确定仍然不推荐使用盐渍 MD5。