0

如果密码在ajax之前被加密,那么如何阻止黑客捕获加密密码并使用它来登录?

是否应该事先从后端发送独特的盐?
难道黑客也不能捕获它吗?

我的问题的背景:
我完成了本教程
http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL
教程浏览器端的摘要
在将密码发送到后端之前对其进行加密它存储在数据库中

从那个链接,我脑海中出现的第一条评论是
“如何防止黑客捕获散列密码并登录?”

4

3 回答 3

6

没有。在客户端上散列密码是一个糟糕的主意。

浏览器和服务器之间的通信应使用 SSL(通过 HTTPS)正确加密。

客户端的散列有两个效果:

  • 它通过暗示它可以替代 SSL 给网站所有者提供了一种虚假的安全感
  • 它增加了对 JavaScript 的依赖
于 2012-11-25T17:40:00.220 回答
2

这有点傻,真的。正如 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);

长话短说,散列是与密码一起散列的消息。

现在将消息和哈希发送到服务器。服务器必须反转该过程:

  • 将消息解析为随机数、日期和用户名
  • 确保随机数与提供给客户的随机数相同
  • 确保日期是最近的(例如在最后 5 分钟内)
  • 找回用户的密码
  • 执行 HMAC 计算,并确保结果等于客户端提供的哈希。
于 2012-11-25T18:12:16.773 回答
1

您发布的教程不仅在客户端散列......它们也在服务器端散列。

基本上在那个注册页面上,JavaScript 会对用户的密码进行哈希处理并将其发送到服务器。据推测,这是为了阻止某人在传输过程中获取密码。一旦散列密码被发送到服务器端,它就会被再次加盐和散列。

这种方法是安全的......但我不确定如果你使用的是 HTTPS,我是否看到了在客户端上散列的优点,你应该这样做。

于 2012-11-25T17:44:04.057 回答