Java - 如何在应用程序中存储密码?

32

我正在开发一个从数据库中读取一些数据的应用程序。 通过标准的登录/密码机制执行与数据库的连接。

问题是:如何存储数据库密码? 如果将其存储为类成员,则可以通过反编译操作轻松检索它。

我认为混淆并不能解决这个问题,因为在混淆代码中也可以很容易地找到字符串密码。

有人有建议吗?


3
这是客户的数据库还是你的数据库?如果是客户的数据库,他应该知道它的密码。如果是你的数据库,它在哪里?为什么客户端应用程序会直接访问数据库,而不通过一些存储密码且字节码对客户端不可用的服务器呢? - JB Nizet
1
通常我会将它硬编码到我的应用程序中,作为一个使用Rot13加密的字符串。(开玩笑的) - Hovercraft Full Of Eels
如果您正在使用Java EE,则有一些标准机制来处理此问题...但我猜您不是。我认为,如果您的应用程序可以完全访问数据库,则隐藏密码并不能帮助提高安全性。 - toto2
相关问题:https://dev59.com/xXNA5IYBdhLWcg3wWsiK - Aaron Digulla
您可以使用Java Keystore API在Java中安全地存储密码。这里有一篇关于它的文章:https://camelcodes.net/securely-manage-passwords-in-java-applications - moolsbytheway
3个回答

26
请勿在代码中硬编码密码。这在最危险的25个编程错误中最近被提出。
将秘密账户和密码硬编码到软件中非常方便,但对于熟练的逆向工程师来说却很危险。如果所有软件使用相同的密码,则当该密码不可避免地泄露时,每个客户都会变得易受攻击。而且由于它是硬编码的,修复起来非常麻烦。
您应该将配置信息(包括密码)存储在应用程序启动时读取的单独文件中。这是防止因反编译而导致密码泄露的唯一真正方法(从一开始就不要将其编译到二进制文件中)。
有关更详细的解释,请参见William Brendel的精彩回答

1
对于一个小而简单的应用程序,您可能不希望涉及很多其他安全措施,这应该是一个配置选项。当您部署应用程序时,它可以读取一个配置文件,其中指定了数据库连接属性。这意味着应用程序本身不知道密码,但您需要访问服务器才能找到密码。

1

有些数据应该是可配置的。就像你刚才说的,它可能是一个用户名密码或一些常见的数据;通常我们做的是创建一个属性配置页面。我过去常用的方法是使用一个XML文件,将您的密码/用户名保存在一些加密格式中。您可以轻松地解析XML以检索连接的密码。

这确保了您的密码随时可以更改的可靠性。这不仅适用于密码,还适用于任何需要定期配置的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接