java - 应用程序级别的安全远程密码协议(protocol)

标签 java jakarta-ee security srp-protocol

我正在编写一个 Java EE 应用程序,它允许新用户自行注册,然后通过 Internet 登录。我将凭据存储在数据库中。

现在,有几种方法可以做到这一点,例如:

  • 发送用户名和密码,最好通过 TLS/SSL 连接
  • 发送用户名和密码哈希码,最好通过 TLS/SSL 连接
  • 使用安全远程密码协议(protocol)(最好通过 TLS/SSL 连接?)

阅读一些文章,安全远程密码协议(protocol) (SRP) 似乎是可行的方法。

但后来阅读了一些其他文章,似乎这只用于一些低级层,例如例如 TLS/SSL 本身。

我仍然认为,建议在应用程序级别使用安全远程密码协议(protocol)。

这是正确的吗?还是有一些很好的理由说明为什么在应用程序级别不需要这样做?

最佳答案

有一些权衡因素需要考虑。首先,当且仅当客户端正确验证服务器的 SSL 证书时,通过 SSL 链接发送原始密码是相当安全的。然而,即使执行了正确的 SSL 证书验证,将原始密码发送到服务器也不是完全理想的。被黑的服务器可能会泄露用户的密码。由于密码经常在其他地方重复使用,这种泄露可能会产生严重的影响。

SRP 的一个优势是它避免了这两个问题。用户的密码永远不会离开他们的机器,并且不需要正确的 SSL 证书验证。 SRP 的相互身份验证属性使 SSL 证书变得多余。事实上,一些应用程序利用这一点来完全避免与适当的 SSL 证书管理相关的麻烦。他们只是在服务器上使用匿名的自签名证书,仅用于数据加密目的,并将身份验证留给应用程序级 SRP。

具体针对您的问题,我认为 SRP 对低级与应用程序级使用的适用性实际上取决于您的应用程序。它在这两个领域都可以很好地发挥作用,但它的最佳用途实际上归结为您正在处理的特定设计约束集。

关于java - 应用程序级别的安全远程密码协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148144/

相关文章:

java - Android 的最佳设计实践与 Java 不同?

java - 如何管理JCA ManagedConnectionFactory的生命周期?

php - 将 htaccess 用于公共(public)目录和私有(private)目录

java - 使用安全管理器阻止公共(public)方法访问

java - 特定应用种子数据群

java - 是否可以将哈希码限制为Java中的特定字符数

java - 如何在android中实现自定义可折叠工具栏?

java - 为什么 Ruby 和 Python 长除法与 GMP 和 Java BigInteger 不同?

java - 我如何处理 Hibernate 中的身份与平等?

解密信用卡号时返回 javax.crypto.IllegalBlockSizeException