自行车棚

 

LinkedIn 密码泄露:给他们点颜色看看

如果计算密码哈希值不需要整整一秒钟,那就太弱了。


Poul-Henning Kamp


650 万个未加盐的 SHA1 哈希 LinkedIn 密码出现在了地下犯罪圈。这句话中有两个词应该引起 LinkedIn 的极大关注:“未加盐”和“SHA1”。

让我来解释一下密码保护的过程,并说明为什么未加盐的密码只比明文密码好那么一丁点。

用户 Alice 选择并输入一个新密码,用于某种计算机服务:“LIMaabotM”。计算机需要能够在 Alice 下次登录时检查她是否输入了正确的密码,因此它将密码存储在一个文件或数据库中。这显然很糟糕,因为任何具有读取权限的人,无论是合法的还是非法的,都可以读取 Alice 的密码并以 Alice 的身份登录。因此,聪明的人在 1970 年代就想出了一个办法,你应该存储密码的单向哈希值来代替。

当有人尝试以 Alice 的身份登录时,该人输入的密码会通过相同的单向哈希函数运行,如果输出与数据库中 Alice 的值匹配,则该人知道正确的密码。这非常有效,现在邪恶的系统管理员 Bob 和工业间谍 Charles 都无法再读取 Alice 的密码了。但他们仍然可以尝试猜测密码。如果他们将他们能想到的所有可能的密码都通过相同的单向函数运行,并且其中一个输出与数据库中 Alice 的值相同,那么他们就找到了可以作为 Alice 帐户密码的东西。

这里一个重要的细节是,他们可以在他们可以访问的任何计算机或计算机集群上执行此操作,而不会引起任何人的注意,这显然就是密码文件生成的原因:犯罪分子需要帮助猜测密码。

这是 LinkedIn 彻底失败的第一个地方:计算 SHA1 函数非常非常快。一台普通的计算机可以使用 GPU 每秒处理 1000 万到 1 亿个哈希值,这使得检查即使是非常大的潜在密码列表也变得轻而易举。使这变得更困难的明显方法是让计算花费更多时间,所以与其

加密密码 = HASH(密码)

我们可以将其改为

加密密码 = HASH(密码)
       for (i = 0; i < 1000; i++)
加密密码 = HASH(加密密码)

在所有可能性中,1,000 是一个太小的值,应该用一些足够大的数字来代替,以便循环在快速计算机上花费整整一秒钟。一秒钟对于登录的用户来说只是一个小细节,但可以将攻击者的暴力破解攻击速度降低 10,000,000 倍或更多。

但我们还没完成。

在一个拥有众多用户的系统中,其中一些人选择相同密码的可能性非常大。人类在选择好的密码方面是出了名的糟糕。对于邪恶的攻击者来说,这意味着所有在数据库中具有相同哈希密码的用户都选择了相同的密码,因此这可能不是一个非常好的密码,攻击者可以使用暴力破解尝试来针对它。

这变成了一个问题,并在 1980 年代得到了解决:为了解决这个问题,我们必须确保即使密码相同,用户也不会存储相同的哈希值。这就是盐的作用:当用户更改密码时,系统会选择一个随机数或字符串 X,并计算

加密密码 = 慢速哈希(X + 密码)

并存储X以及加密密码在数据库中。

即使所有用户都选择“LIMaabotM”作为他们的密码,他们都会得到不同的 X,因此也会得到不同的加密密码,攻击者只有在暴力破解第二个或第三个密码时才会发现这一点,并开始检测到模式。

LinkedIn 也没有这样做。

650 万个哈希密码很可能代表的用户数量远远超过这个数字,因为每个选择“qwer5678”作为密码的人都在该文件中共享一个条目。如果 650 万是所有 LinkedIn 用户选择的唯一密码数量,我也不会感到惊讶,毕竟,想象力是有限的。

泄露的文件没有附加用户名这一事实并不是安慰,这只是意味着泄露它的人知道他们拥有的东西的价值,并想把收获留给自己。

但我们仍然没有完成

到了 1990 年代,人们开始尝试将计算放入可编程芯片中,这意味着使用标准 UNIX 保护的密码crypt(3)函数可以在很短的时间内被暴力破解。我当时应用的解决方法是切换到一个基于 MD5 的更复杂且硬件不友好的哈希函数。它被称为“md5crypt”,并且可能是当今使用最广泛的密码加密器之一,这恰恰表明当时我完全没有传达我的核心见解。所以让我再次强调

你可以随时更改你的慢速哈希()函数,前提是除了盐和加密密码之外,你还要存储使用了哪个函数。这意味着随着计算机速度的加快,你可以增加函数的复杂性来减慢速度,或者如果有人发现削弱密码加密器的分析性攻击,你可以切换到更强大的加密器。下次用户更改密码时,额外的强度就会生效。密码保护的这种特性将允许 LinkedIn 现在升级其密码存储安全性,而无需强制所有用户立即更改密码。正如我所说,md5crypt 几乎是很多人的“默认”密码加密器,但即使它在 1995 年满足了所有相关标准,我也不再认为它足够安全(参见:http://phk.freebsd.dk/sagas/md5crypt_eol.html)。

最近的研究已经设法使 GPU 处理器非常接近每秒 1,000,000 次 md5crypt 操作(参见:http://2012.sharcs.org/slides/sprengers.pdf),这意味着任何 8 个字符的密码都可以在大约两天内被暴力破解。

结论

根据 LinkedIn 的损害控制声明,他们现在正在快速学习,他们现在已经实施了加盐和“更好的哈希”。但我们尚未 выяснить 为什么没有人反对他们使用 1970 年代的方法保护 1.5 亿多个用户密码。

其他所有人也应该注意:即使你使用 md5crypt,你也应该升级你的密码加密算法。作为经验法则:如果计算密码哈希值不需要整整一秒钟,那就太弱了。

喜欢它,讨厌它?请告诉我们

[email protected]

Poul-Henning Kamp ([email protected]) 编写计算机程序已有 26 年,并且是 bikeshed.org 背后的灵感。他的软件已被广泛采用为开源和商业产品中的“幕后”构建模块。他最近的项目是 Varnish HTTP 加速器,它用于加速 Facebook 等大型网站。

© 2012 1542-7730/11/0600 $10.00

acmqueue

最初发表于 Queue 第 10 卷,第 6 期
数字图书馆 中评论这篇文章





更多相关文章

Jinnan Guo, Peter Pietzuch, Andrew Paverd, Kapil Vaswani - 使用机密联邦学习的可信人工智能
安全性、隐私性、问责制、透明度和公平性原则是现代人工智能法规的基石。经典的 FL 在设计时非常强调安全性和隐私性,但以牺牲透明度和问责制为代价。CFL 通过将 FL 与 TEE 和承诺相结合,弥补了这一差距。此外,CFL 还带来了其他理想的安全属性,例如基于代码的访问控制、模型机密性以及推理期间的模型保护。机密计算的最新进展,例如机密容器和机密 GPU,意味着现有的 FL 框架可以无缝扩展以支持具有低开销的 CFL。


Raluca Ada Popa - 机密计算还是密码学计算?
通过 MPC/同态加密与硬件 enclave 进行安全计算,在部署、安全性和性能方面存在权衡。关于性能,您心中想到的工作负载非常重要。对于简单的求和、低次多项式或简单的机器学习任务等简单工作负载,这两种方法都可以在实践中使用,但对于复杂的 SQL 分析或训练大型机器学习模型等丰富的计算,目前只有硬件 enclave 方法在许多实际部署场景中足够实用。


Matthew A. Johnson, Stavros Volos, Ken Gordon, Sean T. Allen, Christoph M. Wintersteiger, Sylvan Clebsch, John Starks, Manuel Costa - 机密容器组
此处介绍的实验表明,Parma(在 Azure 容器实例上驱动机密容器的架构)增加的额外性能开销不到底层 TEE 增加的开销的百分之一。重要的是,Parma 确保了容器组所有可达状态的安全不变性,这根植于证明报告中。这允许外部第三方与容器安全地通信,从而实现广泛的容器化工作流程,这些工作流程需要对安全数据的机密访问。公司获得了在云中运行最机密工作流程的优势,而无需在其安全要求上妥协。


Charles Garcia-Tobin, Mark Knight - 使用 Arm CCA 提升安全性
机密计算具有通过将监管系统从 TCB 中移除来提高通用计算平台安全性的巨大潜力,从而减小 TCB 的大小、攻击面以及安全架构师必须考虑的攻击向量。机密计算需要平台硬件和软件方面的创新,但这些创新有可能增强对计算的信任,尤其是在第三方拥有或控制的设备上。机密计算的早期消费者将需要自行决定他们选择信任的平台。





© 保留所有权利。

© . All rights reserved.