5

我不是在谈论服务器端 node.js。

我想对我网站客户端的密钥使用慢速哈希算法。我发现SHA-256的实现似乎是可靠的。我还发现这个问题导致 OP创建了自己的库

但是,我不确定我是否应该只进行多轮 SHA 散列或信任其中的一些代码,因为我不是安全专家,而且它似乎没有大量的追随者,只被 36 人“盯着” .

在这种情况下,最好的选择是什么?一旦我选择了某些东西,我(基本上)就不能改变方法。

我想要一个慢速散列(不是加密)算法,我宁愿它产生一个短字符串。例如,慢速 60 字符 bcrypt 与快速 70 字符 SHA-256。

4

2 回答 2

7

目前有三种密钥派生函数被广泛认为可以防止暴力破解尝试。密钥派生函数与常规散列算法略有不同,因为它们的设计速度很慢,即使面对现代基于 GPU 的计算也是如此。

我将按照理论上的安全性顺序列出它们:

  • PBKDF2是 RSA 设计的,基于 SHA,是 NIST 推荐的算法。您可以在浏览器中使用几个实现

    Node 用户注意: Node 的crypto模块具有内置的 PBKDF2 功能。用那个。

  • bcrypt基于 Blowfish,比 PBKDF2 稍微安全一些。它经过了相对良好的测试和安全验证,但没有任何标准机构的批准印章,如果这是您的考虑因素。这里有一个通用的 JS 实现

    Node 用户注意事项:使用node.bcrypt,它在单独的线程上执行计算昂贵的东西。

  • 最后,scrypt无疑是理论上最安全(最慢)的 KDF。不幸的是,该算法非常新,因此尚未通过密码学界的严格研究和测试来验证。但是,它有望成为 IETF 标准

    因为算法太新了,所以很难找到实现。我只能找到这个半生不熟的。虽然安全优势非常有希望,但在算法本身及其实现都被验证安全之前,我不推荐使用 scrypt。

这三个实际上如何比较?scrypt论文有一个对比:

算法对照表

实际上,即使是 PBKDF2 也使得除政府以外的任何人破解单个 8 字符密码的成本都很高。

于 2012-11-07T19:30:02.983 回答
0

您始终可以忽略快速 SHA-256 的最后 10 个字符。或 xor 要包含的前 10 个字符。

SHA 的轮数可变。两轮 SHA 在某种程度上应该是可逆的。我有一个模糊的想法,即 20 轮被认为是“安全的”。30 轮应该是“高度安全的”,而 50 轮实际上并没有提高安全性。

SHA 被设计成安全的——不是希望破解者有一台足够慢的机器——而是通过数学证明。如果并且当每轮中不可逆比特的数量增加并置换为 256 位哈希码时,将永远不会有足够的计算机能力来尝试生成该特定哈希码的所有可能序列。宇宙中的能量甚至不足以包裹一个 256 位的计数器。

除非产生哈希的字符串非常小或写在某人显示器上的便利贴上。

于 2012-11-07T17:47:57.747 回答