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

How can I secure a server authentication password securely on client side?

在我的应用程序中,客户端通过 SSLSocket 连接到服务器。为了验证服务器发送盐,客户端发送用给定盐加密的密码。

其实我不想让用户每次都输入他的密码,但另一方面我也不想有安全问题。

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

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

如果我没理解错的话,您当前的协议如下所示:

server -> client: random nonce
server <- client: encrypted password
server <- client: encrypted password

客户不必一次又一次地发送他的密码,我建议您在协议中利用访问令牌。访问令牌("authentication token"、"session id")是一个很大的随机值,服务器returns作为身份验证响应:

server <- client: encrypted password
server -> client: 256-bit access token
server <- client: 256-bit access token
server <- client: 256-bit access token

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

Session management is preferable over continual presentation of credentials as the poor usability of continual presentation often creates incentives for workarounds such as cached unlocking credentials, negating the freshness of the authentication event.

客户端将访问令牌保存在内存中,并使用它代替密码。 如果您想在应用程序启动之间保留访问令牌,那么您必须安全地存储它,这取决于客户端的 OS:

  1. Android:密钥库。
  2. iOS:钥匙串。
  3. Linux/Windows/MacOS:这里很难-只要把token尽可能长时间地保存在内存中,不要放入文件,尽可能长时间地向运行申请。

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

的部分