在 Java 中安全存储密码的最佳实践是什么

2022-09-01 17:51:49

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

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

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

非常感谢

编辑:

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

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

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

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

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

编辑2:

谢谢大家的回答。Paŭlo Ebermann的关于手头问题的信息非常丰富,Chris Smith的链接很有趣,但我接受了JVerstry的链接,因为密钥库可能是我正在采取的路线。


答案 1

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

要编辑的回答:

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


答案 2

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

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

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

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