安全的JDBC连接

我有一个普通的Java应用程序,应该连接到数据库。 我不想在属性文件中存储数据库连接URL和用户名/密码,也不想在应用程序中对其进行硬编码。 解决这个问题的常用方法是什么? Java应用程序如何在不泄露用户名/密码的情况下连接到数据库?

我是.NET开发者,但我遇到了完全相同的情况。

去年我在一家必须符合PCI标准的公司工作才能存储信用卡数据,所以安全性是一个大问题。 URL /登录数据必须存在于某处。 我见过的最常见的保护方法是加密。 我不特别了解Java,但.NET在核心框架中有几个加密命名空间。 我们使用它们来加密数据库登录。

您仍然存在潜在的安全漏洞,这是用于加密/解密数据的加密密钥。 我们在这里使用PCI“补偿控制”方法。 对密钥的访问仅限于“密钥管理”角色。 我们还跟踪密钥本身的访问权限,以便记录所有用户启动和系统启动的访问。 没有一个用户可以访问这些日志,因此单个用户可能没有覆盖音轨。 这些重叠的安全方法实际上创造了一种情况,即需要多个管理员之间的协调阴谋才能使数据处于危险之中。

如果您不愿意存储它,则必须提示它。 你可以加密密码,但是你必须有一把钥匙来解密它,你就会遇到同样的问题。

对于基于服务器的应用程序来说,这个问题的常见解决方案之一是将用户名和密码存储在一个文件中,该文件的用户权限设置为只有应用程序/服务的执行用户才能读取其内容。

例如,您将应用程序作为用户foo-service运行,并且它inheritance了foo-service用户的所有访问权限。 包含用户名和密码的文件只能由该用户读取。 您从文件中读取值并正常连接到数据库。

这种方法可能存在的问题:

  • 该计算机的超级用户可能能够获取数据库的密码。
  • 攻击者已经渗透您的应用程序安全性,可以访问数据库凭据。

通常通过调整应用程序对数据库和网络的访问权限来缓解上述问题。 你提出的几乎任何其他解决方案都会让你陷入鸡与蛋的问题,因为你基本上试图隐藏自己的东西。

最好的方法是将信息作为配置的数据源存储在应用程序服务器的JNDI上下文中。 然后,您可以使用应用程序服务器的工具在部署时配置数据源。 应用程序所要做的就是在运行时查找相应的JNDI名称并使用它。 这是Java Web应用程序的常见模式。

使用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设置系统属性值。 如果value是包含空格的字符串,则必须将该字符串括在双引号中:

http://docs.oracle.com/javase/6/docs/technotes/tools/windows/java.html