Jakarta ee 在我的J2EE应用程序中以加密形式存储外部系统的密码

Jakarta ee 在我的J2EE应用程序中以加密形式存储外部系统的密码,jakarta-ee,encryption,passwords,Jakarta Ee,Encryption,Passwords,我们有一个与多个外部系统对话的J2EE应用程序。每个外部系统都希望我们的应用程序通过用户名/密码进行身份验证。因此,每当我们与外部系统交谈时,我们都需要发送用户名/密码。问题是存储这些密码。我们希望以安全的形式存储这些密码。显然,我们不能使用MD5散列密码,因为我们需要将密码发送到外部系统。所以我们需要加密密码 存储加密密码的位置。数据库 在哪里存储加密密钥 对于这个特殊问题,什么是最佳做法?我不是专家,但我也有类似的要求。来自security.stackexchange.com的讨论了这个问题

我们有一个与多个外部系统对话的J2EE应用程序。每个外部系统都希望我们的应用程序通过用户名/密码进行身份验证。因此,每当我们与外部系统交谈时,我们都需要发送用户名/密码。问题是存储这些密码。我们希望以安全的形式存储这些密码。显然,我们不能使用MD5散列密码,因为我们需要将密码发送到外部系统。所以我们需要加密密码

  • 存储加密密码的位置。数据库
  • 在哪里存储加密密钥
    对于这个特殊问题,什么是最佳做法?

    我不是专家,但我也有类似的要求。来自security.stackexchange.com的讨论了这个问题。公认的答案给出了替代方案。简言之,它们是:

    • 将它们存储在文件系统中,如果有人获得对文件系统的访问权限,这会使它们容易受到攻击
    • 强制管理员在启动时输入它们

    可以考虑将密码存储在数据库中。 使用AES-CBC,每个密码将使用相同的密钥加密,但不同的IV,您还需要在数据库中存储每个密文的IV,一些人建议将IV与密文分开存储。
    加密/解密的唯一密钥可以存储在web服务器的安全区域中

    这里已经讨论了这个问题:


    希望这对您有所帮助。

    您可以在存储和检索密码时使用gpg进行加密/解密。您可以将证书存储在您的服务器中(以及脱机时的备份副本),当然这意味着如果有人获得对您服务器的特权访问,您的密码将被泄露,但在这种情况下,有更紧迫的事情需要担心。

    存储密码的最安全方法是避免将密码存储在服务器上。而是保存密码验证器,该验证器可用于验证密码,但不能用于恢复密码。实现方法之一是。在本议定书中:

  • 服务器根据用户名、密码和salt计算密码验证器并保存它
  • 客户端希望进行身份验证并从服务器请求服务器凭据
  • 服务器随机化验证器以生成服务器凭据并与客户端共享
  • 客户端使用salt(双方都知道)、用户名和密码获得随机客户端凭据,并与服务器共享
  • 服务器将验证器与客户端凭据组合以获得公共共享密钥
  • 客户端将密码与服务器凭据相结合以获取公共共享密钥
  • 如果密钥相同,则验证成功
  • 由于密码未存储在服务器上,且从未由客户端发送,因此无法窃取密码。

    密码可能重复