如何不向BE发送纯文本密码并仍然验证它



我现在有点小毛病。。

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

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

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

你们是怎么解决的?

发送"明文";HTTPS上的密码。密码最终不是明文,因为客户端-服务器通信是根据TLS加密的。

在HTTPS中发送密码之前对其进行加密并没有取得多大效果:如果攻击者拿到了加密的密码,他们可以简单地将其当作实际密码来使用,服务器就不会知道其中的区别。它提供的唯一优势是保护在多个网站上使用相同密码的用户,但它不会让你的网站更安全。

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

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

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

最后,如果TLS被完全破坏,那么有人可以简单地注入一个会泄露密码的脚本。因此,在本地对其进行哈希处理只会以相对较小的幅度提高安全性。对于未来的解密尝试,它可能仍然有些有用,但最终你无论如何都必须依赖TLS。因此,";你们是怎么解决的"一般来说:我们没有。它可能在移动应用程序或全尺寸应用程序中更有意义。

有趣的是,已经有Catena和Makwa等提交给密码哈希竞争对手,明确允许客户端执行部分哈希。通常,这更多地用于密码哈希卸载到其他系统,并减少宝贵服务器资源的使用。

最新更新