如何存储我需要真正价值的密码?

时间:2015-11-12 17:19:27

标签: java security encryption

我有一个密码/密钥,我需要在我的Java程序中使用。我需要将它与外部应用程序一起使用,因此不能选择双向加密。我对单向加密的问题是解密密钥将放在我的代码的某处,所以它最终不再安全。那么如何安全地存储此密码?我正在考虑将其存储在一个已读入的外部文件中,但我不知道这对于部署等有多好。

3 个答案:

答案 0 :(得分:1)

正如评论所说,你不能以安全的方式做到这一点。 任何允许您检索密码的东西都会让其他人也可以这样做。 您可以做的是为每个安装设置一个单独的密码,并让安装该应用程序的用户/管理员担心保护密码。这将允许他们将密码存储在单独的文件中,或者在应用程序启动期间输入密码或任何足够安全的信息。

如果密码是外部服务,他们很可能无论如何都要控制使用。

如果密码是您自己的服务,您可能会问自己,您的"威胁模型"是。如果有人检索到密码,这真的是一个问题,如果是,你可能希望能够在不影响所有用户/安装的情况下关闭该密码。

答案 1 :(得分:0)

如果您使用单向加密,那么您只能加密而不能解密。

在您的密码文件中,使用加密的加密密码。算法是:

  1. 新用户选择密码,系统会为新用户分配ID
  2. Salted Encrypted password = encrypt(password + id);
  3. 将加密的加密密码存储在文件
  4. 当有人登录时,请执行以下操作:

    1. 接收登录尝试的用户名和密码
    2. 用户名
    3. 的查找ID
    4. 加密并加密输入密码,如上所述
    5. 与文件进行比较,如果匹配,则表示确定

答案 2 :(得分:0)

就存储密码而言,你没有一个好的选择:一个有足够决心的人会找到一种方法来获取你的密码。实际上,单向加密的开发是简单实现的结果,即存在可存储可恢复密码的良好选择。

如果您必须与需要密码的应用程序通信,并且您不希望每次需要登录时最终用户都提供该密码,您可以使用不可移植的方式加密少量密码在许多操作系统上经常可用的文本。我们的想法是“捎带”操作系统完成的某些加密,受当前用户或当前网络服务的凭据保护。

例如,在Windows上,您可以使用Windows注册表的当前用户配置单元来存储密码,然后从Java程序中读取该密码。密码以加密形式存储,仅供当前用户使用。保护依赖于在运行程序之前提供登录凭据的用户。

在Mac OS上,您可以通过将密码存储在钥匙串中来获得类似的保护。在这两种情况下,您最终都会得到一个非便携式解决方案。