安全的客户端/服务器身份验证协议

时间:2019-02-06 17:21:44

标签: java security ssl https

我正在处理客户端/服务器应用程序。我已经通过NIO连接了两侧,并且它们的连接由SSL保护。现在,我希望服务器对用户在客户端上输入的登录凭据进行身份验证。不幸的是,那里有大量矛盾的信息。

此线程Is it ok to send plain-text password over HTTPS?指出

  

标准做法是通过HTTPS发送“纯文本”密码。

这让我觉得我的情况也应该很好。

Others

  

您通常要使用质询/响应协议

我希望应用程序尽可能安全。该连接已经受到TLS 1.2和SSL的保护,但是据我了解,这并不会使中间人攻击成为不可能,这使我想实施质询-响应身份验证。但这与我计划的另一种服务器端安全措施相冲突:salting

这是我想象的包含质询-响应和盐析的协议必须是:

  • 客户端发送用户名
  • 服务器以随机挑战和用户的食盐回应
  • 客户端对密码和盐进行哈希处理,然后通过质询再次对其进行哈希处理,并将组合的哈希值发送到服务器
  • 服务器从数据库中检索正确的密码哈希,使用质询对它进行哈希处理,并根据客户端发送的哈希检查结果

此协议有两个问题。

  1. 它会在验证密码之前向客户发送用户盐。我知道盐不是秘密,但仍然感觉不对。
  2. 有人可以入侵客户端,利用此协议可以使他们检查用户是否存在并获得任何用户的认可。

编辑:

问题2可以通过让服务器响应随机盐来解决,以防用户不存在,如Patrick Mevzek在评论中指出的那样。这样,即使是被黑客入侵的客户端也不会知道用户名或密码是否错误。

0 个答案:

没有答案