繁体   English   中英

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

[英]What is the best practice for securely storing passwords in Java

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

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

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

非常感谢

编辑:

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

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

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

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

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

EDIT2:

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

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

回答编辑:

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

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

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

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

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

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

总之,使用bCrypt哈希函数。

首选项API是依赖于内存的实现,因此您将受JVM供应商的支配。 如果它是Sun / Oracle JVM,那么获取数据是微不足道的。 但是,如果您对其进行哈希处理并执行合适的密码策略,则会非常安全。 原始密码很难确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM