以下文章简要介绍了密码哈希以及与算法同步的密码破解软件的发展历程。
翻译自 Bcrypt and a Short History of Password Hashing 。译者对这种历史很感兴趣。
来自 Pixabay 的 Gordon Johnson 的特色照片
作为广泛使用的 bcrypt 密码哈希库的创建者,Niels Provos 发现我们这些身处互联网上的人仍然严重依赖密码,这让他感到惊讶。这是我第一次考虑到可能存在更好的选择。
以下文章是密码哈希和跟进算法的密码破解软件的简要历史。在密码哈希出现之前,密码只是以明文形式存储在密码数据库中。我们已经走了很长的路程,但还有很多工作要做。bcrypt 的创建者 Niels Provos 为 Usenix 撰写了一篇引人入胜的博客文章,其中包含了他的专业知识、建议和对未来的预测。
密码哈希起源于 Unix ,像大多数事物一样。Crypt 是 Unix 的哈希函数。 Robert Morris 在 Unix 的第六版中发布了 Crypt 。 Crypt 基于 Hagelin 密码机(M-209)。Crypt 从未没有问题。开发人员在第七版中重新发布了 Crypt ,加入了 12bit salt,并采用迭代的数据加密标准(DES)密码算法来从用户的密码创建哈希。Salt 创建了 2^12 个不同的哈希函数族,每个用户从中随机选择一个用于其密码。
随着 salt 的引入,密码始终是唯一的,即使原始密码相同,预先计算的哈希攻击也被阻止。这标志着明文密码存储的终结。现在,salt 和哈希密码被存储在密码文件中用于用户认证。尽管 Crypt 当时是具有开创性的,但它最终变得过时。
1997 年的密码哈希已经不再足够。互联网开始腾飞,家用计算机房间随处可见,数据泄露也随之而来。为此, Provos 希望创建“一个能够抵抗计算能力迅速增强的算法”。他成功了,我们仍在使用 bcrypt 。
Bcrypt 的一个关键贡献来自 David Mazieres ,他引入了可调节的成本因素。适应性哈希使得暴力破解和字典攻击变得越来越耗费资源,这是可调节成本因素的结果。
这意味着 bcrypt 可以跟上计算能力的进展。内存硬性和可调节并行性的引入是为了应对在专用硬件(如 GPU )上的密码猜测。内存硬性增加了密码猜测的难度,因为每次猜测都需要大量内存。可调节并行性允许算法利用多个处理核心,进一步增加计算成本,减少通过并行猜测密码所获得的效率。
密码哈希函数及其随时间演变的安全性比较表(Usenix)
我们已经远离明文密码存储的时代。现在,随着所有这些新的高级技术,黑客需要更多的步骤。要窃取密码,他们必须正确地猜测密码,对其进行哈希,并将其与加密的密码数据库进行比较。但或许并不令人惊讶的是,人类是可预测的。密码的可预测性稍微降低了密码猜测的复杂性。有一些密码猜测工具依赖于这种可预测性,它们宣称可以猜测常见密码并与哈希密码进行比较。对于那些在多个网站上使用类似 "pas$w0rd" 这样的密码的人来说,这点需要引起警惕。
当然,哈希技术越来越好,但破解技术也在不断进步。我们不是在谈论一些居住在母亲地下室里的家伙,虽然我敢肯定有很多这样的人。这些工具绝非轻视。密码破解工具呈指数增长。曾经每秒处理 45 个密码的速度,现在已经达到每秒 63 亿个密码。
猫捉老鼠的游戏将继续进行。现代密码哈希技术降低了暴力破解密码的有效性,但事情并未就此结束。现在出现了“密码堆积”( password stuffing )的攻击方式,攻击者利用之前泄漏的凭据来获取入口。诸如限制频率、验证码(哇,它们确实有用)、多因素认证(MFA)等工具在大大遏制了攻击方面发挥了重要作用。云服务意味着现在有许多重要数据存储和远程处理。确保安全进入依然至关重要。
接下来怎么办?为什么仍然会发生数据泄露,我们该做些什么?现在是自我反思的时候。Provos 认为问题出在我们身上。他巧妙地说:“大多数安全挑战在技术上都有解决方案,减少数据泄露的主要问题归结为人为因素和采用现有安全技术的成本。”不同的人扮演着不同的角色。有些公司为了其他地方的花哨功能而节省了顶级安全性。内部风险是另一类问题。这包括社交工程、不满的员工和无知。最后,存在技能鸿沟。
密码是我们数字生活中不可或缺的一部分。它们的部署、创建和撤销都很方便。但它们也是有风险的。要聪明地使用密码,自担风险,并且为了这个世界上所有美好的事物,不要使用任何含有 "password" 一词的密码。