关于安全性:在Java中安全存储密码的最佳实践是什么?

What is the best practice for securely storing passwords in Java

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

我希望用户能够只输入一次凭证,而不需要再次提示。

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

多谢

编辑:

非常感谢你的建议。似乎有些困惑,毫无疑问,因为我可能没有把这个问题说得很清楚…

我将给出一个低血压的情况:

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

在不需要重新输入密码的情况下(在应用程序启动时自动连接),将密码存储在用户的计算机中的最佳方法是什么?

一种"记住我"功能(我知道这本身不是一个很好的实践…)

编辑2:

谢谢大家的回答。爸?Lo Ebermann的关于手头问题的信息非常丰富,Chris Smith的链接很有趣,但我已经接受了Jeverstry的链接,因为密钥库可能是我要走的路线。


您可以使用一个本地密钥库来存放密码而不是密钥。

编辑回答:

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


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

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

您可以使用系统的权限系统,但如果攻击者是与您的Java程序在同一个用户帐户中运行的某些程序(如果攻击者具有root访问权限,甚至会帮助更少),那么这通常是没有帮助的。

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


不管使用哪种语言,我认为这是适用的:http://codahale.com/how-to-safety-store-a-password/

总之,使用bcrypt哈希函数。

首选项API依赖于内存实现,因此您将由JVM供应商决定。如果它是Sun/Oracle JVM,那么获取数据就很简单。但是,如果您散列它并强制执行一个合适的密码策略,它将是非常安全的。原始密码将很难确定。