在客户端在 sha1 中散列 n*x 次还是在 sha512 中散列 n 次更好?

信息安全 密码学 密码 哈希 密码管理 客户端
2021-09-08 16:07:44

我已经知道在将用户密码发送到服务器之前,我将在 sha512 或 n*x 中对用户密码进行 n 次哈希处理,然后再将其发送到服务器。一旦到达服务器,我将使用 bcrypt set 来使用 ~1/100th一秒钟。在继续之前,关于我使用 sha512 而不是 sha1 背后的推理,我想说明几件事。首先,我知道客户端安全是一个笑话。其次,我知道一个 Man- in-the-middle 攻击可以剥离页面的 javascript 的哈希函数。最后,我意识到这将意味着人们将无法在没有启用 javascript 的情况下登录。

我目前正在使用 sha512 设置为在 ie8 [2] 中使用 ~1s,它是这样设置的。

  1. 获取用户的密码和用户名。
  2. 添加一个静态随机数(以真正延长它,仅此而已)。
  3. 通过散列函数对其进行散列,在本例中为 sha512。
  4. 取那个散列,通过 sha512 散列它,将当前循环号打包成一个字节。
  5. 重复步骤 4 n 次。
  6. 完成后,获取该值并将其放入密码字段中。
  7. 最后让系统POST到服务器。

那么,做 n*x 的 sha1 哈希与 n 次 sha512 的优势是什么?使用该系统的全部要点是,如果发生数据库泄漏,攻击者将不得不将尝试查找密码所花费的时间增加 z 时间。此外,通过在它到达服务器之前对其进行散列(以及使用 TLS),它可以实现,因此,如果出现一些奇怪的错误,密码永远不会被视为纯文本。

我相信 sha512 是更好的选择,因为 sha1 已经损坏,因此它的安全性不值得,但另一方面。我为 sha512[1][] 找到的最快的 javascript 库比本机代码慢约 50 倍,但我发现的最快的 sha1 库仅比本机代码慢约 17 倍。

因此,问题是与 sha512 的较少迭代相比,损坏的 sha1 是否会导致整体安全性的更大损失,从而降低攻击者的速度,到目前为止,sha2 系列中没有一个被远程破坏。以前有没有其他人处理过这个问题?

[1]:通过 fuzzing 产生与 c 实现/php 相同的哈希值,对于约 300 个输入产生相同的哈希值。

[2]:在 ie10 发布一年后,我想放弃对 ie8 的支持,这样我就可以将哈希数提高到更合理的水平。

2个回答

这听起来有点牵强,可能会适得其反,不是最理想的,而且它并没有真正提供太多的安全性。“密码”实际上是以明文形式看到的,因为密码是您最终发送的字符串,以代替真实密码。你到底想达到什么目的?

无论如何,如果您真的试图让“真正的”密码“不以明文形式显示”(并且不信任 ssl),那么您应该考虑实施质询-响应协议。如果他不希望以明文形式传输密码(或与您的情况类似的密码),这通常是一种方式。

现在,如果您真的想继续您的计划,并且仍然执行您描述的客户端技巧,那么 SHA-1 非常适合。甚至 MD5 也很好,而且速度要快得多。关于那些不安全的功能的“街头谈话”是关于冲突的——这是您在实施中可能不关心的事情。你也可以看看http://www.jcryption.org/,它是一个对 html 表单进行非对称加密的 jquery 库。

但是,我再次强烈建议不要进行整个实施。

客户端散列增加的额外保护是非常微不足道的。从服务器的角度来看,哈希结果就是密码,因为服务器授予能够显示该哈希值的任何人的访问权限,而无需实际密码。特别是,如果一个“奇怪的错误”导致哈希值对攻击者显而易见,那么您就输了:攻击者可以通过显示哈希值简单地连接到服务器,而无需运行您的 Javascript(普通用户可能无法绕过一点 Javascript,但假设攻击者没有更强大的能力是不安全的)。

剩下的保护是,如果攻击者只看到哈希,他(还)没有猜到“真实密码”,并且将不能(立即)在同一用户也有帐户的其他服务器上尝试该密码。这不会改变服务器的安全性,但可以将其视为“社区服务”。

至于多重哈希导致的额外攻击成本:虽然想法是合理的,但使用 Javascript 却不是。Javascript 比 C 或汇编慢得多。在 Javascript 中使用 IE8 需要一秒钟,但没有什么可以迫使攻击者在 Javascript 中运行他的攻击。他可能会使用 C、汇编,也可能是 GPU。如果你想让字典攻击变得困难,你需要让攻击者的哈希变慢. 通过使用 Javascript 在客户端上执行此操作,您可以防止自己进行尽可能多的迭代以实现适当的安全性。一种看待它的方法如下:我们希望每个“猜测”对于攻击者来说都是缓慢的。不幸的是,我们不能让攻击者变慢,除非我们也让“诚实系统”变慢。因此,诚实系统(客户端和/或服务器)的性能限制了我们可以注入的缓慢程度。通过使用次优语言在客户端执行此操作,我们人为地加重了诚实系统而不是攻击者的缓慢负担。

在实践中,攻击成本将是 bcrypt 的;相比之下,散列可以忽略不计。对于 SHA-512 尤其如此,它使用 64 位整数运算,由于缺少 64 位整数类型,在 Javascript 中实现起来非常缓慢。因此,您的问题的确切答案是:如果目标是诱导字典攻击速度缓慢,则使用 SHA-1(或 SHA-256)将比 SHA-512“更好”;但即便如此,就服务器端 bcrypt 所做的事情而言,引起的缓慢可以忽略不计,所以这个问题有点毫无意义。另一方面,1s的额外延迟会激怒普通用户,他们以没有耐心着称。