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不适合这种情况,因为它很容易安装。如果您决定这样做,请寻找或的实现。

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

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

[……]

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

这就导致了:

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

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

基本上,问题在于:

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

  • 您的客户端不信任SSL,所以他们希望您使用额外的安全代码
  • 该安全代码是通过SSL传递的
注意:另外,SHA-256不适合这种情况,因为它很容易安装。如果你决定
var sha256 = new jsSHA('SHA-256', 'TEXT');
sha256.update(some_string_variable_to_hash);
var hash = sha256.getHash("HEX");
import sjcl from 'sjcl'

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