Node.js 如何不发送纯文本密码,但仍然验证它

Node.js 如何不发送纯文本密码,但仍然验证它,node.js,vue.js,security,authentication,bcrypt,Node.js,Vue.js,Security,Authentication,Bcrypt,我现在有个难题 我正在VueJS和NodeJS上构建应用程序。。在身份验证过程中,我需要验证密码和用户名是否匹配(显然) 问题是,我不想将明文密码从FE(VueJS)发送到BE(NodeJS),但已经用bcrypt加密了 问题是,我无法检查给定的哈希是否与数据库中存储的哈希匹配。所以这让我只能发送纯文本密码-但从我偏执的安全角度来看,这是不好的 你们是如何解决这个问题的?通过HTTPS发送“明文”密码是标准做法。密码最终不是明文,因为客户机-服务器通信是按照TLS加密的 在以HTTPS发送密码之

我现在有个难题

我正在VueJS和NodeJS上构建应用程序。。在身份验证过程中,我需要验证密码和用户名是否匹配(显然)

问题是,我不想将明文密码从FE(VueJS)发送到BE(NodeJS),但已经用bcrypt加密了

问题是,我无法检查给定的哈希是否与数据库中存储的哈希匹配。所以这让我只能发送纯文本密码-但从我偏执的安全角度来看,这是不好的


你们是如何解决这个问题的?

通过HTTPS发送“明文”密码是标准做法。密码最终不是明文,因为客户机-服务器通信是按照TLS加密的


在以HTTPS发送密码之前对密码进行加密并没有多大用处:如果攻击者获得了加密密码,他们只需将其当作实际密码使用,服务器就不会知道其中的区别。它提供的唯一优势是保护在多个站点上使用相同密码的用户,但这不会使您的站点更加安全。

通过HTTPS发送“明文”密码是标准做法。密码最终不是明文,因为客户机-服务器通信是按照TLS加密的


在以HTTPS发送密码之前对密码进行加密并没有多大用处:如果攻击者获得了加密密码,他们只需将其当作实际密码使用,服务器就不会知道其中的区别。它提供的唯一优势是保护在多个站点上使用相同密码的用户,但这不会使您的站点更加安全。

如前所述,HTTPS的安全层通常是可信的

从技术上讲,可以将密码散列一分为二。您只需在客户端(浏览器)上执行一次迭代,在服务器上执行其余的迭代。您希望在服务器上至少执行一次迭代,否则您将获得客户端发送以存储在数据库中的值:即,获取数据库中值的副本将直接泄漏所有登录凭据。。。不太好

因此,如果您想继续使用该算法,这可能意味着要执行两个单独的bcrypt哈希。我想你可以重复使用同一种盐,但最好是分开存放。当然,在客户端执行bcrypt将在本地占用CPU,这可能会影响性能、启动风扇等,并且假设JS运行正常

最后,如果TLS被完全破坏,那么有人可以简单地插入一个脚本来泄漏密码。因此,在本地对其进行散列只能以相对较小的幅度提高安全性。对于将来的解密尝试,它仍然有一定的帮助,但最终你将不得不依赖TLS。所以“你们怎么解决这个问题?”的答案通常是:我们没有。在移动应用程序或全尺寸应用程序中,这可能会稍微有点意义


有趣的是,有人提交了Catena和Makwa等密码哈希竞赛,明确允许客户端执行部分哈希。通常,执行此操作更多是为了将密码散列卸载到其他系统,并减少宝贵服务器资源的使用。

如前所述,HTTPS的安全层通常是可信的

从技术上讲,可以将密码散列一分为二。您只需在客户端(浏览器)上执行一次迭代,在服务器上执行其余的迭代。您希望在服务器上至少执行一次迭代,否则您将获得客户端发送以存储在数据库中的值:即,获取数据库中值的副本将直接泄漏所有登录凭据。。。不太好

因此,如果您想继续使用该算法,这可能意味着要执行两个单独的bcrypt哈希。我想你可以重复使用同一种盐,但最好是分开存放。当然,在客户端执行bcrypt将在本地占用CPU,这可能会影响性能、启动风扇等,并且假设JS运行正常

最后,如果TLS被完全破坏,那么有人可以简单地插入一个脚本来泄漏密码。因此,在本地对其进行散列只能以相对较小的幅度提高安全性。对于将来的解密尝试,它仍然有一定的帮助,但最终你将不得不依赖TLS。所以“你们怎么解决这个问题?”的答案通常是:我们没有。在移动应用程序或全尺寸应用程序中,这可能会稍微有点意义


有趣的是,有人提交了Catena和Makwa等密码哈希竞赛,明确允许客户端执行部分哈希。通常,执行此操作更多的是为了将密码散列卸载到其他系统,并减少宝贵的服务器资源的使用。

但是带有salt的bcrypt将永远不会生成相同的散列:)请看,是的,它不会。这个问题并不清楚您是否已经在使用bcrypt或只是打算使用。在第一种情况下,不可能发送散列,除非您想向客户机公开原始salt,这在某种程度上违背了使用bcrypt的目的。您可以对传输的密码使用非对称加密。公钥可能会被盗,但如果您主要关心的是普通密码可以很容易地从HTTPS流量中嗅出,那么这可能仍然会有所帮助。您正在处理多少用户?您的流程可以是:1)收集用户标识符。2) 发送到后端。3) 从后端收集散列密码4)将这些密码发送到前端5)在前端进行比较JS 6)将agknowledgement发送回后端,以了解哪些密码散列匹配,但使用salt的bcrypt将永远不会生成