Hash 是否有任何SHA-256 javascript实现通常被认为是可信的?

Hash 是否有任何SHA-256 javascript实现通常被认为是可信的?,hash,javascript,sha256,sha2,Hash,Javascript,Sha256,Sha2,我正在为一个论坛写一个登录名,在将密码发送到服务器之前,需要在javascript中对密码客户端进行散列。我很难确定我可以信任哪个SHA-256实现。我期待着会有一些大家都使用的权威脚本,但我发现不同的项目都有自己的实现 我意识到使用别人的密码永远是一种信仰的飞跃,除非你有资格亲自检查它,而且“值得信赖”没有通用的定义,但这似乎是一种非常普遍和重要的东西,应该就使用什么达成某种共识。我只是天真吗 编辑,因为它出现在评论中:是的,我们在服务器端再次进行更严格的哈希。客户端哈希不是我们保存在数据库中

我正在为一个论坛写一个登录名,在将密码发送到服务器之前,需要在javascript中对密码客户端进行散列。我很难确定我可以信任哪个SHA-256实现。我期待着会有一些大家都使用的权威脚本,但我发现不同的项目都有自己的实现

我意识到使用别人的密码永远是一种信仰的飞跃,除非你有资格亲自检查它,而且“值得信赖”没有通用的定义,但这似乎是一种非常普遍和重要的东西,应该就使用什么达成某种共识。我只是天真吗


编辑,因为它出现在评论中:是的,我们在服务器端再次进行更严格的哈希。客户端哈希不是我们保存在数据库中的最终结果。客户端哈希是因为人类客户端请求它。他们没有给出具体的原因,可能他们只是喜欢过度使用。

不,没有办法使用浏览器JavaScript来提高密码安全性。我强烈推荐你阅读。在您的案例中,最大的问题是鸡蛋问题:

交付Javascript加密的“鸡蛋问题”是什么? 如果您不信任网络传递密码,或者更糟糕的是,不信任服务器不保存用户机密,那么您就不能信任他们传递安全代码。在你引入密码之前嗅探密码或阅读日记的攻击者只是在你引入密码之后劫持密码

[……]

为什么我不能使用TLS/SSL来交付Javascript加密代码? 你可以。这比听起来更难,但您可以使用SSL安全地将Javascript加密传输到浏览器。问题是,使用SSL建立了安全通道后,您不再需要Javascript加密;你有“真正的”加密技术

这就导致了:

在Javascript中运行加密代码的问题在于,实际上加密所依赖的任何函数都可能被用于构建托管页面的任何内容悄悄覆盖。加密安全性可以在过程的早期(通过生成虚假随机数,或通过篡改算法使用的常数和参数)或稍后(通过将密钥材料退回给攻击者)撤销,或者在最可能的情况下通过完全绕过加密来撤销。

任何一段Javascript代码都没有可靠的方法来验证其执行环境。Javascript密码不能问,“我真的在处理一个随机数生成器,还是攻击者提供的某个随机数生成器的复制品?”而且它肯定不能断言“除了我,作者,批准的方式之外,任何人都不允许对这个密码做任何事情”.这两个属性通常在使用加密的其他环境中提供,在Javascript中是不可能的

基本上,问题在于:

  • 您的客户端不信任您的服务器,因此他们希望添加额外的安全代码
  • 该安全代码由您的服务器(他们不信任的服务器)提供
或者

  • 您的客户端不信任SSL,所以他们希望您使用额外的安全代码
  • 该安全代码是通过SSL传递的

注意:另外,SHA-256不适合这种情况,因为它很容易安装。如果您决定这样做,请寻找或的实现。

过时:许多现代浏览器现在都拥有一流的加密操作支持。见下文


包含SHA-256的一个实现。虽然JS中的crypto并不像其他实现平台那样经过严格审查,但这一平台至少部分由密码学领域的知名人士开发,并在一定程度上由其赞助,这意味着该项目有一些真正知道他在做什么的人的监督。该项目也得到了政府的支持

然而,值得指出的是……
... 如果在提交密码之前对密码客户端进行散列,则散列就是密码,原始密码将变得不相关。攻击者只需拦截散列即可模拟用户,如果该散列未经修改地存储在服务器上,则服务器将以纯文本形式存储真实密码(散列)

因此,您的安全性现在变得更差了,因为您决定使用以前受信任的方案。

的SHA-256实现既快速又可靠

要在几个SHA-256 JavaScript实现上运行测试,请转到

在我的机器上的结果表明forge是最快的实现,并且比公认答案中提到的Stanford Javascript加密库(sjcl)要快得多


Forge的大小为256KB,但是提取SHA-256相关代码会将大小减少到4.5KB,请参见tylerl提到的Stanford库。我发现非常有用(Github repo here:)。我不知道它到底有多可靠,但我已经使用了它的API SHA256、Base64、RSA、x509等,它运行得非常好。事实上,它也包括斯坦福图书馆


如果你想做的只是SHA256,那可能就太过分了。但如果你在相关领域有其他需求,我觉得这很合适

我发现这个实现非常容易使用。还拥有丰富的BSD风格许可证:

jsSHA:

我需要一种快速的方法来获取SHA-256哈希的十六进制字符串表示形式。只花了三行:

var sha256 = new jsSHA('SHA-256', 'TEXT');
sha256.update(some_string_variable_to_hash);
var hash = sha256.getHash("HEX");
在上,我找到了这个使用内部js模块的代码段:

异步函数sha256(消息){ //编码为UTF-8 const msgBuffer=new textcoder().encode(消息); //散列消息 const hashBuffer=await crypto.minute.diges
import sjcl from 'sjcl'

const myString = 'Hello'
const myBitArray = sjcl.hash.sha256.hash(myString)
const myHash = sjcl.codec.hex.fromBits(myBitArray)