如何在客户端安全地保护服务器身份验证密码?

时间:2020-04-08 07:07:11

标签: java security passwords keystore

在我的应用程序中,客户端通过SSLSocket连接到服务器。要进行身份验证,服务器将发送盐,而客户端将发送使用给定盐加密的密码。

我实际上不想让用户每次都输入密码,但是另一方面,我不想遇到安全问题。

我了解了密钥库,但是它们安全吗?而且据我了解,用户仍然必须输入密码。

什么是安全且用户舒适的解决方案?

1 个答案:

答案 0 :(得分:0)

如果我正确理解,您当前的协议如下所示:

px-sm-5

客户端不必一次又一次地发送密码,我建议您在协议中使用访问令牌。访问令牌(“身份验证令牌”,“会话ID”)是服务器返回的较大随机值,作为身份验证响应:

<div class="mx-auto order-0 mb-0 h3 px-sm-5">

这是一个会话管理。 NIST提供有关会话管理的建议:https://pages.nist.gov/800-63-3/sp800-63b.html#sec7

与连续显示凭据相比,会话管理更可取,因为连续显示的可用性很差,通常会诱使人们采取变通办法,例如缓存的解锁凭据,从而使身份验证事件不新鲜。

客户端将访问令牌保存在内存中,并代替使用它。 如果要在应用程序启动之间保留访问令牌,则必须安全地存储它,并且取决于客户端的操作系统:

  1. Android:KeyStore。
  2. iOS:钥匙串。
  3. Linux / Windows / MacOS:在这里很难-仅将令牌尽可能长地保留在内存中,不要放入文件中,使应用程序尽可能长地运行。

无论哪种方式,访问令牌都必须在一段时间后过期,即使它由于某种原因泄漏了,客户端也会在一段时间后获得一个新令牌。请参阅有关re-authentication in NIST的部分。