暴雪用来保护密码的 SRP 有多安全?

信息安全 密码 哈希
2021-09-04 12:05:53

暴雪最近宣布他们的网络遭到入侵,但他们在声明中向用户保证,攻击者可以访问的密码信息以安全的方式保存:

我们还知道北美服务器上玩家的战网密码(不是实际密码)的加密版本被盗用了。我们使用安全远程密码协议 (SRP) 来保护这些密码,该协议旨在使提取实际密码变得极其困难,并且还意味着必须单独破译每个密码。

我查了 SRP,它似乎是一种安全交换密码的方法。我熟悉使用散列存储密码,但我不知道 SRP 暴雪使用的散列密码与其他常用散列密码方法(如 PKBDF2、bcrypt 或 scrypt)相比如何?

对受 SRP 保护的密码进行暴力破解(或使用字典攻击)有多难?

4个回答

SRP 旨在保护密码的传输免受暴力攻击,即使密码很容易被暴力破解。

但是,如果某些暴雪身份验证服务器遭到入侵,则相关的攻击向量是不同的。除了存储方案,攻击者还可以监听正在进行的交易,并同时存储由 SRP 服务器生成的临时 DH 机密。后一种攻击有点复杂,需要攻击者进行大量准备,但是,它肯定会泄露用于对受感染系统进行身份验证的任何登录名。

更传统的攻击向量是验证值。在 SRP 中,服务器端的验证器值不是传统的哈希值,而是求幂的结果,就像在 Diffie-Hellmann 中一样。

据我所知,没有对 SRP 与 PBKDF2 或 bcrypt 的详细分析。在 SRP 网站 (srp.stanford.edu) 的某个地方,我曾经看到一个注释,人们实施了一个暴力破解器,并发现所需的暴力破解工作类似于传统的哈希破解。

这是意料之中的:众所周知,这种求幂很难求逆,就像哈希函数一样。假设暴雪实现了像 RFC2945 这样的标准化协议并且没有尝试自己发明细节,这些验证值也将包含使彩虹表不切实际的盐。

主要区别在于暴力破解单个验证值的努力。在这里,像 bcrypt/PBKDF2 这样的系统采用比例因子来增加每次密码猜测的计算量。我知道的 SRP 方案没有明确支持这一点。求幂的计算成本通常比哈希高一些,但这取决于您正在操作的组(模数)。我认为增加 SRP 中验证值的模数很容易,但它也会增加每个对等方的其他 2 次幂运算的计算工作量,这些运算量必须在每个协议运行中完成。

更新:再次查看 RFC2945,密码和盐首先被散列,然后取幂。在这里使用 PBKDF2 很容易,而不仅仅是散列来实现暴力破解工作的缩放因子,而不会对协议的其余部分产生太大影响。此外,即使选择了一个小的/不合适的指数 N,该方案仍然与简单的基于质询-响应的 pw-authentication 一样安全。

总体而言,暴雪可能有点幸运,因为他们的密码存储方式非常少见,而且适当的暴力破解工具并不常见。然而,对于一个坚定的攻击者来说,存储秘密的 SRP 方法并不比具有良好反暴力缩放因子的最先进方法更安全(可能稍微不安全)。话虽这么说,但我对暴雪使用一些最先进的加密技术进行密码验证表示赞赏,因为在线暴力破解通常更成问题。

您可能会发现以下信息:http ://www.opine.me/blizzards-battle-net-hack/

简而言之,暴雪对SRP的实现使用了SHA1作为hash,还有一个modexp操作,就是‘慢’的部分。英特尔白皮书推断,256 位 modexp 在 i7-2600 上的运行速度约为 400,000 ops/sec。根据在 EC2 上使用 c1.xlarge 实例进行的实际测试(0.66 美元/小时),您可以花 100 美元检查大约 1000 亿个密码。

由于密码是加盐的,因此必须单独攻击每个密码。因此,如果模数为 256 位,您可以以 100 美元的价格针对 100,000 个用户测试字典中排名前 1,000,000 个的密码。1024 位模数会使成本增加 64 倍。

编辑 - 显然,有可能将攻击的复杂性降低到无非是加盐的 SHA1:http ://www.opine.me/srp-to-sha1/ 。不适用于 1024 位模数(在 Battle.net v2 中使用)。

SRP 是一个PAKE协议。它与使用的哈希完全分开。SRP 使用散列函数作为加密原语。必须使用真正的散列,例如 PBKDF2 或 bcrypt,来实现这个原语,因为没有完美的散列函数是已知的。由于密码在传输和存储过程中总是被散列和加盐,这是 SRP 的要求,最弱的元素是散列加盐密码。这显然假设协议本身没有缺陷,即质数、随机数或传递哈希攻击的错误选择。

对于魔兽争霸3,第一款暴雪游戏引入了SRP(旧游戏使用挑战-响应),它根本不安全-您只需在256位素数字段中找到离散对数即可获得密码哈希x,然后就足以登录,或者您可以使用它来高速破解密码。

仍然存在的基本问题是,这是一个实际的攻击向量,它到底有多糟糕?可以有效地对大值执行离散对数的算法是重要研究的主题,但是,并没有现成的“脚本小子”工具来执行计算。GDLOG 是“用于离散对数问题的通用数域筛算法的开源实现”。使用 GNFS 计算 256 位数字的离散对数实际上是大材小用,Sam在单台机器上只用了两个小时就完成了初始预计算此时,从 v 恢复 x 的单个离散日志需要可变时间,“从 15 秒到几分钟不等就看我们的运气了。” Sam 指出,这里有很大的提高性能的潜力。

对于像 WOW 和 SC2 这样的战网 2.0 游戏,使用 1024 位素数,该大小的离散对数现在应该是无法解决的,但暴力破解仍然是可能的。请记住,哈希和验证器是加盐的。