在Java中安全存储密码的最佳做法是什么?

Rui*_*ira 24 java security password-storage

在Java桌面应用程序中存储密码的推荐方法是什么?

我希望用户能够只输入一次credencials而不会再次提示.

在个人项目中,我一直在使用Preferences API,但我认为这与将其存储在纯文本(安全方面)没有什么不同.

非常感谢

编辑:

非常感谢你的建议.似乎有些混乱,毫无疑问,因为我可能没有把问题弄得很清楚......

我将给出一个假设的场景:

假设我正在为远程数据库创建一个简单的前端,该数据库使用用户名/密码创建连接字符串.通常,每次应用程序启动时都会提示用户输入用户名/密码组合.

将密码存储在用户机器中的最佳方法是什么,无需重新输入(在应用程序启动时自动连接).

一种"记住我"的功能(我知道这本身并不是一个很好的做法...)

EDIT2:

感谢大家的回答.PaŭloEbermann对手头的问题非常有用,Chris Smith的链接很有意思,但我接受了JVerstry的一个,因为密钥库可能是我正在采取的路线.

Jér*_*nge 10

您可以使用本地密钥库来放置密码而不是密钥.

回答编辑:

Keystores非常适合您的需求.如果您需要额外的保护,您可以要求用户在启动应用程序时输入一个密码来访问所有密码.然后,您可以使用启动应用程序时使用的一个密码,使用简单的salt-and-stretch方法(生成加密密钥)来保护存储的数据库密码.

  • 这个问题有8000个视图.您的答案在复杂的安全主题上有6行(最初只有一行).你是认真的吗?像这样的问题的答案倾向于有更多的upvotes(和线).什么是密钥库?怎么用?它是Java的东西还是OS的东西?我希望我能为你的"*回答*"提出的每一个问题做出投票. (7认同)
  • @TomášZato这是一个Java问题,密钥库是Java SSE(安全套接字扩展)的核心功能.对于这个问题的所有观点,这个答案没有很多赞成. (2认同)

Paŭ*_*ann 5

无法以 Java 程序可以检索的方式在计算机上存储某些内容(无需用户输入密码),但此计算机上的其他程序(在同一用户的帐户中运行)无法检索它。

您可以尝试以某种方式对其进行加密,并将解密算法与解密密钥一起隐藏在您的程序中(白​​盒加密),但是攻击者只需要在调试器中运行您的程序即可解密数据。

您可以使用系统的权限系统,但是如果攻击者是在与您的 Java 程序相同的用户帐户中运行的某个程序,这通常无济于事(如果攻击者具有 root 访问权限,则帮助更小)。

最好的办法是将密码存储在 USB 存储器上,并在您使用完后告诉用户将其取出,但是如果攻击程序正在运行并在您从记忆棒中读取秘密时进行观察,即使这样也可以没有帮助。