如果密码在ajax之前被加密,那么如何阻止黑客捕获加密密码并使用它来登录?
是否应该事先从后端发送独特的盐?
难道黑客也不能捕获它吗?
我的问题的背景:
我完成了本教程
http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL
教程浏览器端的摘要
在将密码发送到后端之前对其进行加密它存储在数据库中
从那个链接,我脑海中出现的第一条评论是
“如何防止黑客捕获散列密码并登录?”
如果密码在ajax之前被加密,那么如何阻止黑客捕获加密密码并使用它来登录?
是否应该事先从后端发送独特的盐?
难道黑客也不能捕获它吗?
我的问题的背景:
我完成了本教程
http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL
教程浏览器端的摘要
在将密码发送到后端之前对其进行加密它存储在数据库中
从那个链接,我脑海中出现的第一条评论是
“如何防止黑客捕获散列密码并登录?”
没有。在客户端上散列密码是一个糟糕的主意。
浏览器和服务器之间的通信应使用 SSL(通过 HTTPS)正确加密。
客户端的散列有两个效果:
这有点傻,真的。正如 Quentin 所说,此时您所做的只是更改密码,您并没有让它变得更安全。现在,密码不是“私人字符串”,而是 sha1('私人字符串')。如果你对它进行十六进制编码,它恰好是'5ee913d43470d39020f15ac10ff9cf7a8761b55a'。
您所做的只是将一个密码换成另一个密码。
要安全地交换密码,最好的选择是使用 HTTPS。把手放下。如果由于某种原因您无法使 HTTPS 正常工作,或者您不想为证书付费,那么您将不得不发挥创造力。
您最难克服的问题是用户设置密码的初始阶段。在不使用公钥加密的情况下,您最好的选择是在表单中传递一个随机生成的对称密钥,并使用该密钥在客户端加密密码,并在服务器端解密。如果有人碰巧在观看交易,它可能会被破坏。但这是一个没有公钥加密就无法解决的问题。
设置密码后,可以非常安全地进行登录。当服务器为客户端呈现登录表单时,它可以生成一个随机数作为表单的一部分:
<input type='hidden' name='nonce' value='b45354f5b437c82beeed71d4d56ef3a47d0df2d3'/>
Username: <input type='text' name='username'/><br/>
Password: <input type='password' name='password'/>
客户端使用 Javascript 和加密库(例如crypt-js)创建散列消息。消息应包括时间戳、用户名和随机数。然后创建一个 HMAC。
var ts = Math.round((new Date()).getTime() / 1000);
var message = '' + ts + ':' + username + ':' + nonce;
var hash = CryptoJS.HmacSHA1(message, password);
长话短说,散列是与密码一起散列的消息。
现在将消息和哈希发送到服务器。服务器必须反转该过程:
您发布的教程不仅在客户端散列......它们也在服务器端散列。
基本上在那个注册页面上,JavaScript 会对用户的密码进行哈希处理并将其发送到服务器。据推测,这是为了阻止某人在传输过程中获取密码。一旦散列密码被发送到服务器端,它就会被再次加盐和散列。
这种方法是安全的......但我不确定如果你使用的是 HTTPS,我是否看到了在客户端上散列的优点,你应该这样做。