如何不将纯文本密码发送给BE并仍然对其进行验证

问题描述

我现在有晕厥..

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

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

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

你们如何解决这个问题?

解决方法

标准做法是通过HTTPS发送“纯文本”密码。密码最终不是纯文本的,因为客户端-服务器通信已按照TLS进行了加密。

在通过HTTPS发送密码之前对密码进行加密并没有太大作用:如果攻击者获得了加密密码,他们可以像使用实际密码一样简单地使用它,服务器将不知道它们之间的区别。它提供的唯一好处是可以保护在多个站点上使用相同密码的用户,但不会使您的站点更安全。

,

如前所述,通常HTTPS的安全层是受信任的。

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

因此,如果您想继续使用该算法,则可能意味着要执行两个单独的bcrypt哈希。您可以重复使用我想使用的盐,但是始终最好存储单独的盐。当然,在客户端执行bcrypt会使本地CPU峰值运行,这可能会影响性能,增加风扇转速等,并假定JS可以正常运行。

最后,如果TLS被完全破坏,那么有人可以简单地注入一个脚本来泄漏密码。因此,在本地对它进行哈希处理只会增加相对较小的安全性。对于将来的解密尝试,它仍然可能会有些用,但是最终无论如何您都必须依赖TLS。那么答案是“你们如何解决这个问题?”通常是:我们没有。在移动应用程序或全尺寸应用程序中,这可能更有意义。

有趣的是,密码哈希竞赛已经提交了诸如Catena和Makwa之类的提交,这些提交明确允许客户端执行部分哈希。通常,这样做的目的是将密码散列卸载到其他系统,并减少宝贵服务器资源的使用。