AJAX登录调用中的Javascript哈希,提高了安全性吗?

5

从我在网站上看到的许多帖子来看,通过AJAX或传统表单进行的登录同样安全。(参考:登录/会话cookie、Ajax和安全性 Ajax登录和JavaScript cookie,这是安全的吗?)

我的问题是:

  1. 如果我在将用户密码发送到服务器之前(通过客户端/JavaScript哈希库)对其进行哈希处理,是否可以增加防止窃听的安全性?

  2. 如果我放置一个表单令牌(一个基于随机数,另一个基于时间),是否可以防止跨站请求伪造攻击?

  3. 经过这一切后,我是否已经覆盖了所有基础?这个表单是否安全?

1
如果您需要发送密码(以及可能需要登录会话cookie的其他所有内容),请使用SSL。 - Thilo
3个回答

5
实际上,这可能是一个重大的安全问题。密码被哈希的原因是为了应对失败。攻击者可能会获取数据存储(SQL注入),然后获得哈希值。如果您仅使用哈希值登录,则攻击者无需破解恢复的哈希值即可访问应用程序。
“重放攻击”也是一个问题。如果在验证期间嗅探哈希值,那么有什么阻止我重放那个请求进行身份验证?
采用消息摘要函数进行身份验证的协议会向客户端提供nonce,用作一次性盐。Microsoft的SMB NTLM身份验证就是一个很好的例子,但它已经遇到了很多问题。
使用SSL,不仅仅是用于登录。OWASP A9指出,会话ID不能通过不安全的通道泄露。毕竟,如果几毫秒后就泄露了真实的身份验证凭据,谁还关心密码呢?

大多数人在登录时不实现CSRF保护。毕竟,攻击者首先必须知道密码,因此“会话劫持”是无意义的。


只是出于好奇,如果在提交密码之前使用公钥加密,然后在服务器上使用匹配的私钥解密密码,这样会更好吗? - Esailija
@Esailija 非对称加密本身也存在问题,例如重放攻击和缺乏初始化向量。但更重要的是,如果您没有保护会话ID,则什么都没有得到保护。任何嗅探网络数据的攻击者都可以完全访问。 - rook
啊,是的,我应该更仔细地阅读你的回答。我完全错过了第三段的最后一部分...好的,谢谢你的回答。 - Esailija
你还应该确保警告用户页面应该是安全的,并且他们应该检查浏览器的URL栏,以查看https前缀和证书的有效性。否则,有人可能使用sslstrip进行中间人攻击,不知情的用户会泄露他们的凭据。 - Polynomial
@Polynomial,sslstrip 不是用户的问题。您应该在 HTTP 标头中设置“严格传输安全”标志,这是浏览器专门为解决 sslstrip 开发的。对于 cookie,您还应该设置“http_only”标志以使 XSS 攻击更加困难,并设置“secure”标志以仅使用 HTTPS。此外,设置 x-frame-options HTTP 标头以防止点击劫持。但是,op 实际上并没有询问这个... - rook
@Rook - 感谢提供的信息。我不知道HTTP头中的严格标志。虽然我已经知道了x-frame-optionshttp_only技巧,但是出于你所指出的原因,我没有提到它们 :) - Polynomial

1
稍微离题一下,回答问题3,不行!还要记住,AJAX和标准表单同样不安全。
实现安全认证很难。除非你是在进行学术练习,否则我强烈建议使用框架提供的库,如果你足够幸运拥有一个好的框架。
你还需要考虑以下事项,以及更多。
  • 为会话cookie实现一个适当的随机且不可猜测的会话ID。
  • 不允许强制使用会话ID。
  • 当权限或凭据发生更改(例如,因为用户已登录或注销)时,立即使会话无效并开始一个新的会话。
  • 提供注销功能,并确保在注销时使会话无效。
  • 将cookie设置为HttpOnly-最好要求HTTPS,并仅将cookie设置为安全的。
  • 考虑限制会话有效性以包括检查一些其他信息,以帮助匹配用户,例如用户代理。
  • 始终在非使用后过期会话,并且不要通过重新连接用户到其旧的http会话来实现“保持登录状态”。
  • 确保2个会话不能同时具有相同的会话ID
  • 确保在会话无效时销毁所有会话数据。新用户可能会被分配先前使用过的会话ID。这个新会话不能访问已经针对该会话ID设置的任何会话数据。

太好了!PHP的session_start()函数中是否内置了“确保2个会话在同一时间不能具有相同的会话ID”? - Joseph Szymborski
1
@JosephSzymborski 是的。您可能会对这个 PHP 相关的链接感兴趣 http://phpsec.org/projects/guide/4.html - Cheekysoft

0

如果攻击者知道你使用的哈希算法,那么他们可以破解它。如果你想添加盐,则必须将其发送到浏览器,攻击者可能会拦截它。使用时间作为盐也行不通,因为时间相对较短,所以他们也可以解决这个问题。


“哈希”(与加密相反)通常是不可逆的。 - David Gelhar
@DavidGelhar 谢谢,我改了措辞,之前的用词不太恰当。 - qw3n
1
@David Gelhar 他的意思是一种简单的攻击。John the ripper或者rainbowcrack应该可以解决问题。 - rook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接