【发布时间】:2010-10-13 23:51:19
【问题描述】:
我有一个普通的 Java 应用程序,它应该连接到数据库。我不想将数据库连接 url 和用户名/密码存储在属性文件中或在应用程序中对其进行硬编码。解决此问题的常用方法是什么? Java 应用程序如何在不泄露用户名/密码的情况下连接到数据库?
【问题讨论】:
我有一个普通的 Java 应用程序,它应该连接到数据库。我不想将数据库连接 url 和用户名/密码存储在属性文件中或在应用程序中对其进行硬编码。解决此问题的常用方法是什么? Java 应用程序如何在不泄露用户名/密码的情况下连接到数据库?
【问题讨论】:
如果您不愿意存储它,则必须提示它。你可以加密密码,但是你必须有一个密钥来解密它,你会遇到同样的问题。
【讨论】:
我是 .NET 开发人员,但我遇到了完全相同的情况。
去年我在一家公司工作,该公司必须符合 PCI 标准才能存储信用卡数据,因此安全性很重要。 URL/登录数据必须存在于某处。我见过的最常见的保护它的方法是加密。我不特别了解 Java,但 .NET 在核心框架中有几个加密命名空间。我们使用这些来加密数据库登录。
您仍然存在潜在的安全漏洞,即用于加密/解密数据的加密密钥。我们在这里使用了 PCI“补偿控制”方法。对密钥的访问仅限于“密钥管理”角色。我们还跟踪了密钥本身的访问,以便记录所有用户启动和系统启动的访问。没有一个用户可以访问这些日志,因此单个用户不可能覆盖轨道。这些重叠的安全方法本质上造成了这样一种情况,即需要多个管理员之间的协同阴谋才能将数据置于危险之中。
【讨论】:
最好的方法是将信息作为配置数据源存储在应用服务器的 JNDI 上下文中。然后,您可以使用应用程序服务器的工具在部署时配置数据源。应用程序所要做的就是在运行时查找适当的 JNDI 名称并使用它。这是 Java Web 应用程序的常见模式。
【讨论】:
对于基于服务器的应用程序,该问题的常见解决方案之一是将用户名和密码存储在一个文件中,该文件的用户权限设置为只有应用程序/服务的执行用户才能读取其内容。
例如,您以 foo-service 用户身份运行应用程序,它继承了 foo-service 用户的所有访问权限。包含用户名和密码的文件只能由该用户读取。您从文件中读取值并正常连接到数据库。
这种方法可能存在的问题:
上述问题通常可以通过调整应用程序对数据库和网络的访问权限来缓解。几乎您提出的任何其他解决方案都会让您陷入先有鸡还是先有蛋的问题,因为您基本上是在试图隐藏某些东西。
【讨论】:
使用 Web 服务将您的应用程序与执行数据库访问的服务器分开。为您的 Web 应用程序签名,然后只允许正确签名的应用程序调用 Web 服务服务器。
【讨论】:
您可以尝试使用系统属性加载文件。 -Dapplication.configuration=application.properties.
如果没有传递属性文件,那么您应该使用带有默认配置的默认文件。
当文件存在时,您可以使用配置中提供的值覆盖默认值。
java -Dlog4j.configuration=file:/log4j.properties -Dapplication.configuration=file:/live-conf.conf -jar app.jar "applicationarg1" "applicationarg1"
更多来源: https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
如何覆盖系统属性:
-Dproperty=值 设置系统属性值。如果 value 是包含空格的字符串,则必须将字符串括在双引号中:
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/java.html
【讨论】: