有什么SHA-256的JavaScript实现通常被认为是值得信赖的吗?

我正在写一个论坛的login名,并需要散列在JavaScript中的密码客户端发送到服务器之前。 我无法弄清楚我实际上可以信任哪个SHA-256实现。 我期待着有一种每个人都使用的权威脚本,但是我发现所有的项目都有自己的实现。

我认识到,使用其他人的密码永远是一个信仰的飞跃,除非你有资格审查它自己,并没有普遍的定义,“可信赖”,但这似乎是一些共同和重要的东西,应该是某种对使用什么达成共识。 我只是天真?

编辑,因为它在评论中出现了很多:是的,我们再次在服务器端做一个更严格的散列。 客户端哈希不是我们保存在数据库中的最终结果。 客户端哈希是因为客户端请求它。 他们没有给出具体的原因,可能他们就像矫枉过正。

斯坦福大学JSencryption库包含一个SHA-256的实现。 尽pipeJS中的encryption技术并没有像其他实现平台一样得到很好的validation,但是这个encryption技术至less部分是由Dan Boneh部分开发的,在某种程度上是由Dan Boneh提供的 。 ,这意味着项目有一些实际上知道自己在做什么的人的监督。 该项目也得到了NSF的支持。

值得指出的是,但是…
…如果您在提交密码之前对密码进行哈希处理 ,那么哈希就是密码 ,原来的密码变得不相关。 攻击者只需要拦截哈希以模仿用户,如果该哈希未经修改就存储在服务器上, 则服务器将以纯文本forms存储真正的密码(哈希)

所以你的安全性现在变得更糟,因为你决定把自己的改进添加到以前的可信计划中。

不,没有办法使用浏览器JavaScript来提高密码安全性。 我强烈build议你阅读这篇文章 。 在你的情况下,最大的问题是鸡蛋问题:

什么是提供Javascriptencryption的“鸡蛋问题”?

如果您不信任networking来传递密码,或者更糟糕的是,不要相信服务器不保留用户机密,则不能相信他们提供安全代码。 在你引入密码之前,嗅探密码或阅读日记的同一个攻击者就是在你之后简单地劫持密码。

[…]

为什么我不能使用TLS / SSL来传递Javascriptencryption代码?

您可以。 这比听起来难,但你安全地传送Javascriptencryption到浏览器使用SSL。 问题是,用SSLbuild立了一个安全通道,你不再需要Javascriptencryption; 你有“真正的”密码学。

这导致了这一点:

在Javascript中运行encryption代码的问题在于,实际上encryption所依赖的任何函数都可以被用于构build托pipe页面的任何内容无声地覆盖。 在这个过程中(通过生成伪随机数,或者篡改algorithm使用的常量和参数),或者稍后(通过将密钥材料返回给攻击者)或者在最可能的情况下—完全绕过encryption。

任何一段Javascript代码都没有可靠的方法来validation它的执行环境。 Javascript的encryption代码不能问,“我真的在处理一个随机数字生成器,或与一个由攻击者提供的传真​​?” 而且它肯定不能断言“除了我作者批准的方式外,没有人可以对这个秘密秘密做任何事情”。 这些是通常在使用encryption的其他环境中提供的两个属性,而在JavaScript中是不可能的。

基本上这个问题是这样的:

  • 你的客户不信任你的服务器,所以他们想要添加额外的安全代码。
  • 这个安全代码是由你的服务器(他们不信任的)提供的。

或者,

  • 您的客户不信任SSL,所以他们希望您使用额外的安全代码。
  • 该安全代码通过SSL提供。

注意:另外,SHA-256并不适合这个,因为暴力破坏非迭代密码非常容易。 如果您决定这样做,请查找bcrypt , scrypt或PBKDF2的实现 。

Forge的SHA-256实现是快速和可靠的。

要在几个SHA-256 JavaScript实现上运行testing,请访问http://brillout.github.io/test-javascript-hash-implementations/

在我的机器上的结果表明伪造成为最快的实现,也比在接受的答案中提到的斯坦福JavaScriptencryption库(sjcl)快得多。

伪造是256 KB大,但是提取SHA-256相关的代码将大小减小到4.5 KB,见https://github.com/brillout/forge-sha256

我发现这个实现很容易使用。 还有一个慷慨的BSD风格的许可证:

jsSHA: https : //github.com/Caligatio/jsSHA

我需要一个快速的方法来获得SHA-256散列的hex表示forms。 它只用了三行:

var sha256 = new jsSHA('SHA-256', 'TEXT'); sha256.update(some_string_variable_to_hash); var hash = sha256.getHash("HEX"); 

除了Tylerl提到的斯坦福大学图书馆。 我发现jsrsasign非常有用(Github repo在这里: https : //github.com/kjur/jsrsasign )。 我不知道它的值得信赖,但是我使用了SHA256,Base64,RSA,x509等API,它的工作非常好。 实际上,它也包括斯坦福大学的自由。

如果你想要做的只是SHA256, jsrsasign可能是一个矫枉过正的问题。 但是如果您在相关领域有其他需求,我觉得这是一个很好的select。