在这种特殊情况下,我是否允许在 java 程序中存储密码?

信息安全 密码
2021-09-11 17:40:37

我有一个在 Ubuntu-Server 上运行的 Java-Server 程序,它每 5 分钟获取一次我的 android-smartphone(我随身携带)的当前位置数据。我的架构如下:我的智能手机使用 tlsv1.2 连接到服务器并传输 gps 位置。收到数据后,服务器程序与本地 mysql 数据库建立连接,插入位置、时间等。

我从 William Brandl 那里读到了这个答案,我想,是的,但这并没有提高我的安全级别。

我是唯一可以物理访问我的机器的人。所以我的java程序只有在我的服务器被入侵时才能被逆向工程。在这种特殊情况下,将用户名和密码存储到单独的文件中对我来说绝对没有意义。该程序在低权限用户下运行。因此,如果我的用户或我的服务器遭到入侵,有人可以轻松地对我的程序进行逆向工程以获取蜂蜜(用户名和密码),就像打开包含同一用户可读的用户名和密码的文件一样。

在这种特殊情况下,将用户名和密码存储在单独的文件中是否会增加工作量?对于这种存储敏感数据的情况,是否有更安全的方法?

如果这是错误的地方,请容忍我。

3个回答

我只会在运行时将密码存储在内存中,但这有一个缺点。每次启动/重新启动服务器时都需要输入密码。这是管理明文密码的最安全方法。

另外,我会按照 r00t 的建议,在 MySQL 服务器上创建两个用户,一个具有读取权限,一个具有写入权限。以防万一有人能够访问您的服务器并转储内存。

首先:我同意你的观点,威廉布兰德尔的作品更倾向于方便而不是安全。我什至可能会说他错了,他说将凭据存储在文件中是唯一的方法。至少当他遗漏有关加密的任何部分时。他提供的CWE-259 文章的链接甚至特别指出:

用户名和密码信息不应以明文形式包含在配置文件或属性文件中,因为这将允许任何可以读取文件的人访问资源。如果可能,请加密此信息并避免使用CWE-260CWE-13

事实是,无论您决定做什么,有权访问您文件的攻击者都将能够窃取您的凭据。


由于您使用低权限用户运行服务器,访问受限且密码强,因此您通常非常安全。只要您锁定所有用户,只为您的数据库用户提供所需的最低权限等,您可能不会遇到任何麻烦。

单独的文件

您可能需要考虑将凭据存储在单独的文件中,只是为了您自己的方便。那是因为如果您选择更改数据库,那么您可以轻松地换入和换出新凭据。这样,您不必重新编译源代码。

您还可以加密存储在该单独文件中的凭据。但是,这将需要您的代码解密密钥,这意味着解密密钥位于已编译的 Java 文件中。这实际上只是通过默默无闻的安全(例如虚假的安全感),老实说并没有增加太多。然而,它会增加一点难度,而不仅仅是明文的用户名和密码。

启动

我唯一可以建议使其更安全、避免硬编码并将凭据存储在单独文件中的方法是在启动时提供凭据。从技术角度来看,这将更加麻烦(例如,每次服务器关闭时您都必须手动重新启动服务器),但至少会消除有关在何处存储凭据的所有问题。

但是,凭据存储在内存中。因此,如果攻击者真的想要获取凭据,则可能只需要内存转储,无论您将凭据存储在何处。

概括

我说,为了您自己的方便,将凭据存储在一个文件中,但如果您想将凭据保存在源代码中,请不要害怕。(请注意程序员审查您的代码,因为这是不好的做法;-))。同样,只需确保监控您的服务器,确保对您的用户和服务应用最低权限类型的策略,并确保所有凭据都是唯一且强大的。

笔记:

对于未来的读者;这并不是说您不应该关心如何进行凭据管理。许多框架和语言都提供了加密和保护您的凭据的方法,并且始终鼓励遵循最佳实践。但事实是,如果有人可以访问您的文件,那么您通常就不走运了。所以保护你的文件!

我建议您创建两个 mysql 用户,并将一个只有写入权限的用户存储在 java 程序中。

对您而言,请使用具有读取权限的第二个。

如果您的服务器受到威胁,攻击者将无法读取您的位置,只需插入虚假位置即可。

- 编辑 -

要回答您是否可以在代码中添加您的凭证:

它不会提高或降低凭据的安全性,但它可以让您更难地修改它。事实上,您将需要重新编译您的 java 代码。

良好的做法是,出于这个原因,凭据应该在一个文件中。如果密码泄露,您的响应时间会更长。