我有一个普通的Java应用程序,应该连接到数据库。我不想在属性文件中存储数据库连接URL和用户名/密码,也不想在应用程序中对其进行硬编码。解决此问题的常用方式是什么? Java应用程序如何在不泄露用户名/密码的情况下连接到数据库?
答案 0 :(得分:5)
我是.NET开发者,但我遇到了完全相同的情况。
去年我在一家必须符合PCI标准的公司工作才能存储信用卡数据,所以安全性是一个大问题。 URL /登录数据必须存在于某处。我见过的最常见的保护方法是加密。我不特别了解Java,但.NET在核心框架中有几个加密命名空间。我们使用它们来加密数据库登录。
您仍然存在潜在的安全漏洞,这是用于加密/解密数据的加密密钥。我们在这里使用了PCI“补偿控制”方法。对密钥的访问仅限于“密钥管理”角色。我们还跟踪密钥本身的访问权限,以便记录所有用户启动和系统启动的访问。没有一个用户可以访问这些日志,因此单个用户可能无法覆盖轨道。这些重叠的安全方法实际上创造了一种情况,即需要多个管理员之间的协调阴谋才能使数据处于危险之中。
答案 1 :(得分:3)
如果您不愿意存储它,则必须提示它。你可以加密密码,但是你必须有一把密钥来解密它,你就会遇到同样的问题。
答案 2 :(得分:2)
基于服务器的应用程序解决此问题的常见方法之一是将用户名和密码存储在一个文件中,该文件的用户权限设置为只有应用程序/服务的执行用户才能读取其内容。 / p>
例如,您将应用程序作为用户foo-service运行,并且它继承了foo-service用户的所有访问权限。包含用户名和密码的文件只能由该用户读取。您从文件中读取值并正常连接到数据库。
这种方法可能存在问题:
通常通过调整应用程序对数据库和网络的访问权限来缓解上述问题。你提出的几乎任何其他解决方案都会让你陷入鸡与蛋的问题,因为你基本上试图隐藏自己的东西。
答案 3 :(得分:0)
最好的方法是将信息作为配置的数据源存储在应用程序服务器的JNDI上下文中。然后,您可以使用应用程序服务器的工具在部署时配置数据源。应用程序所要做的就是在运行时查找相应的JNDI名称并使用它。这是Java Web应用程序的常见模式。
答案 4 :(得分:0)
使用Web服务将应用程序与执行数据库访问的服务器分开。签署您的Web应用程序,然后只允许正确签名的应用程序调用Web服务服务器。
答案 5 :(得分:0)
您可以尝试使用系统属性加载文件。 -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