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

时间:2014-04-07 08:00:03

标签: java-ee encryption passwords

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

  1. 存储加密密码的位置。数据库?
  2. 存储加密密钥的位置?
  3. 此特定问题的最佳做法是什么?

4 个答案:

答案 0 :(得分:1)

我不是专家,但我也有类似的要求。来自security.stackexchange.com的This article讨论了这个问题。接受的答案提供了替代方案简而言之,它们是:

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

答案 1 :(得分:1)

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

此问题已在此处讨论过:Preferred recoverable method to store passwords in database

希望这对你有所帮助。

答案 2 :(得分:1)

您可以在存储和检索密码时使用gpg加密/解密。您可以将证书存储在您的服务器中(以及离线的备份副本)当然这意味着如果某人获得了您的服务器的特权访问权限,您的密码就会受到损害,但在这种情况下还有更多紧迫的事情需要担心。

答案 3 :(得分:0)

存储密码的最安全方法是避免在服务器上存储密码。而是保存密码验证程序,它可用于验证密码,但不能用于恢复密码。其中一个实施是Secure Remote Password protocol。在这个协议中:

  1. 服务器从用户名,密码和salt计算密码验证程序并保存。
  2. 客户端希望从服务器进行身份验证并请求服务器凭据。
  3. 服务器随机化验证程序以生成服务器凭据并与客户端共享它们。
  4. 客户使用salt(双方都知道),用户名和密码来获取随机客户端凭据并与服务器共享。
  5. 服务器将验证者与客户端凭据组合在一起以获取公共共享密钥。
  6. 客户端将密码与服务器凭据组合在一起以获取通用共享密钥。
  7. 如果密钥相同,则验证成功。
  8. 由于密码未存储在服务器上且客户端始终未发送密码,因此无法将其窃取。