在发布然后使用 BCRYPT 之前,我应该如何散列密码?

How should I hash passwords before posting and then using BCRYPT?

我正在制作一个登录系统,登录时密码当前从 JavaScript 发送到 PHP 文件。

在PHP中我使用下面的一段代码进行hash。

$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);

在使用 POST 发送之前,我应该如何对 JavaScript 中的密码进行哈希处理?

我显然不想影响 BCRYPT 的安全性。

在没有 HTTPS 的情况下,不要介意在客户端做这样的事情,因为它们会混淆您的代码,无论如何请查看您的加密算法。

客户端做的事情并不是你能真正控制的。我的意思是,即使您对密码进行哈希处理,客户端也有可能在 hashing/encryption.

之前获取密码
var password = document.getElementById('login').value;
console.log(password); // It is as simple as it
//hash password...

上面举个简单的例子来说明,客户端可以这样获取密码,也可以通过XSS攻击让别人获取。你应该尽最大努力保护你的客户免受 XSS 攻击,但你无法控制客户端发生的事情。

如果您担心的是Man In The Middle (MITM)攻击,最重要的是使用具有正确算法的TLS证书(这取决于您服务器的OpenSSL版本)。
简而言之,您应该使用 HTTPS 来保护您的客户端免受 MITM 攻击。

所以根据我的说法,发送前不需要hash/encrypt密码。

如果需要,您可以在客户端玩一些 bcrypt 实现(搜索 "bcrypt js",有一个 example of implementation)。

但是,这意味着您必须在服务器和客户端之间使用相同的加盐值。 This answer 说明。

因此,如果客户端遭到破坏,您的秘密服务器盐值也会起作用

但是,你是什么意思?如果您认为发送和比较哈希比发送一次纯密码并在服务器端对其进行哈希处理更安全,那您就错了。中间人会窃取密码或哈希值,从而破坏安全性。

正确答案已在评论中给出:您最好使用 HTTPS 以获得最佳安全性。至少,如果您不能使用 HTTPS 协议,请使用摘要身份验证 (What is digest authentication?)