26

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

我希望用户能够仅输入一次凭据,而不会再次收到提示。

在个人项目中,我一直在使用 Preferences API,但我假设这与以纯文本形式存储(安全方面)没有什么不同。

非常感谢

编辑:

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

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

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

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

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

编辑2:

谢谢大家的回答。Paŭlo Ebermann's 对手头的问题提供了非常丰富的信息,Chris Smith 的链接很有趣,但我接受了 JVerstry 的链接,因为密钥库可能是我要走的路线。

4

3 回答 3

13

您可以使用本地密钥库,您可以在其中放置密码而不是密钥。

编辑答案:

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

于 2011-08-10T21:30:31.923 回答
5

没有办法以您的 Java 程序可以检索的方式在计算机上存储某些东西(无需用户输入密码),但是这台计算机上的其他程序(在同一用户的帐户中运行)无法检索它。

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

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

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

于 2011-08-10T23:46:15.953 回答
-3

无论使用哪种语言,我认为这都适用:http ://codahale.com/how-to-safely-store-a-password/

总之,使用 bCrypt 哈希函数。

首选项 API 的实现依赖于内存,因此您将受到 JVM 供应商的摆布。如果它是 Sun/Oracle JVM,那么获取数据是微不足道的。但是,如果您对其进行散列并执行一个体面的密码策略,它将非常安全。原始密码将很难确定。

于 2011-08-10T21:15:54.580 回答