【问题标题】:How can I secure a server authentication password securely on client side?如何在客户端安全地保护服务器身份验证密码?
【发布时间】:2020-07-20 12:47:50
【问题描述】:

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

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

我阅读了有关密钥库的信息,但它们安全吗?而且据我了解,用户仍然需要输入密码。

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

【问题讨论】:

  • 你应该在 Security SE 上问这种问题,但根本问题是这会将“用盐散列”密码变成一个新的 密码等效。您可能正在寻找类似质询身份验证协议之类的东西,但不要发明自己的安全性。

标签: java security passwords keystore


【解决方案1】:

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

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

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

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

会话管理优于持续展示凭据,因为持续展示的低可用性通常会激励解决方法,例如缓存解锁凭据,从而否定身份验证事件的新鲜度。

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

  1. Android:密钥库。
  2. iOS:钥匙串。
  3. Linux/Windows/MacOS:这里很难——只要将令牌尽可能长时间地保存在内存中,不要放入文件中,让应用程序尽可能长时间地运行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2022-01-22
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多