给出以下场景:我们有一个用于更改帐户密码的html表单。它看起来像这样:
CurrentPassword: __________________
NewPassword: __________________
NewPasswordAgain: __________________
我们希望通过ajax调用发送此请求。如果我们发送它并且我们离开我们的计算机(没有注销并停留在完全相同的页面上),有人可以打开webkit检查器(或firebug)并看到如下内容:
http://cl.ly/3y213W1q0U2y2e251k0O
您的解决方案是什么让这更安全?甚至可以在这里使用ajax调用,还是最好使用“正常”的html表单,在发送后重新加载整个页面?
答案 0 :(得分:5)
使用“普通”html表单会遇到同样的问题,因为数据包嗅探可以很容易地在POST或GET标题中显示相同的数据。
我能想到的最佳解决方案是通过javascript加密密码用户端。你真的不必担心“如果用户禁用了javascript怎么办?”因为,在这种情况下,AJAX请求也不会通过。显然,这可能会对您如何存储密码产生影响,但它会允许您继续使用AJAX请求进行密码更新。
答案 1 :(得分:3)
作者对此处的加密连接不感兴趣。他也可能已经这样做了。他想要的是能够隐藏任何有权访问计算机的人的密码(和用户名),并可以打开检查工具来查看页面上发生的网络。
您可以做的最简单的事情之一是在身份验证成功的情况下刷新页面。
你应该做的就是每当用户按下“注销”时刷新页面。这应该清除所有以前的网络数据。
不太好的选择是在发送密码之前对密码进行加密,混淆和散列。
在客户端散列密码并不理想,因为这可以防止在服务器端使用带有密钥的散列密码(想想HMAC)。 HMAC密码是最好的,因为密钥保存在文件系统上,而盐保存在数据库中。破解密码哈希需要对系统进行相当可靠的访问。
可以反转对模板进行模糊处理和加密。如果有人在Webkit Inspector上看到登录请求,他可能会非常有兴趣花时间去除你的防御。
我强烈建议在某些时候刷新页面以完全避免问题。其他选择看起来不太好。
答案 2 :(得分:1)
在传输时加密密码,并确保您正在进行的呼叫是通过SSL完成的!
答案 3 :(得分:1)
要在不使用SSL的情况下确保此安全,请使用SHA-2在客户端上哈希密码。虽然这将保护密码本身,但它不会保护某人不会嗅探哈希密码。因此,您不能简单地使用哈希密码进行身份验证。
执行此操作的一种方法是在进行身份验证时使用服务器生成的随机盐。要进行身份验证,客户端从服务器请求salt,然后哈希密码一次(为了匹配存储在服务器上的哈希版本),然后使用从服务器收到的盐再次哈希,然后最后使用第二个ajax进行身份验证使用salted-hashed密码进行查询。
只有当服务器与其自己存储的哈希密码相匹配时,服务器才会进行身份验证,并使用之前为客户端提供的相同盐进行哈希处理。
这样,某人无法使用简单的哈希版密码进行身份验证。由于服务器提供的每个盐只有一次有效,因此某人基本上不可能拦截它并进行身份验证。 (他们必须拦截salt请求,然后尝试在合法客户端之前进行身份验证,同时欺骗他们的会话)。
这可以在不使用SSL的情况下保护用户的密码,防止在合法用户进行身份验证时使用截获的数据登录,并且相当容易实现。当然,就保护您网站上的实际数据而言,SSL是无可替代的,但对于许多没有任何敏感信息的典型网站,您应该更关心防止用户密码被盗经常使用相同的密码。这解决了这个问题。
请注意,这对阻止会话劫持没有任何作用,但您可以通过在用户会话中包含特定于浏览器的信息,并且一次只允许一个活动会话,以及要求,将风险和损害降至最低重新认证以更改电子邮件地址或密码。
答案 4 :(得分:0)
根据您所需的安全级别,您可以在发送ajax请求之前使用RSA和公钥加密来加密浏览器中的密码。在服务器端,您将解密密码并正常处理它们。
当然,您还需要小心删除用于保存输入密码的任何变量,我确信此处还有其他安全漏洞,但加密至少会为您提供一定程度的保护。一种攻击。
Here's one library I found快速搜索。 (免责声明:我没有对此进行测试,但看起来还不错)
最后,我强烈建议您通过SSL传输所有登录信息。这在浏览器和服务器之间的整个浏览器会话之上增加了额外的安全层。