我正在建立一个登录系统,当登录密码时,当前会从JavaScript发送到PHP文件。
在PHP中,我使用以下代码进行哈希。
$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);
在使用POST发送密码之前,我应该如何在JavaScript中散列密码?
我显然不想影响BCRYPT的安全性。
答案 0 :(得分:3)
在客户端进行的操作并非真正由您控制。我的意思是即使您使用哈希密码,客户也可以在散列/加密之前获取密码。
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攻击的原因。
所以根据我的说法,在发送之前不需要对通道进行散列/加密。
答案 1 :(得分:2)
如果你愿意,你可以玩一些bcrypt实现客户端(搜索“bcrypt js”,有一个example of implementation)。
但是,这意味着您必须在服务器和客户端之间使用相同的salt值。 This answer解释道。
因此,如果客户遭到入侵,您的秘密服务器盐值也会。
但是,你的意思是什么?如果你认为发送和比较哈希更安全,而不是发送一次普通密码并在服务器端哈希,那你就错了。中间的一个人会偷走密码或哈希,并会打破安全。
评论中给出了正确的答案:您最好使用HTTPS以获得最佳安全性。至少,如果您不能使用HTTPS协议(What is digest authentication?)
,请使用摘要身份验证答案 2 :(得分:1)
没有HTTPS永远不会在客户端做这样的事情,因为他们会混淆你的代码看到你的加密算法。
答案 3 :(得分:-1)
为了存储在数据库中而需要进行的任何数据操作都不应该在客户端完成。此外,