如何避免在代码中明确编写MySQL数据库密码

时间:2014-11-05 14:18:52

标签: java mysql

我正在建立一个动态网站,它将从Apache Tomcat界面查询MySQL数据库。虽然数据库使用加密密码存储所有用户信息,但我仍然需要在java代码中明确写入密码(root或admin帐户)来验证用户。我觉得这不是很安全。这样做的正确方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:1)

由于您正在使用像Tomcat这样的应用程序服务器/ servlet容器,因此可以将databsae连接详细信息用于服务器,只需从应用程序中获取连接。

在Tomcat中,您可以在context.xml文件中配置JDBC连接,您可以在其中设置连接的驱动程序,URL,用户和密码。您还可以为此连接配置引用名称。 EJ:

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/javatest"/>

稍后,您在应用程序的web.xml配置文件中添加对此服务器资源的引用:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

最后,您现在可以实例化将对象引用的资源的名称作为JNDI上下文:

Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();

代码取自this Apache Tomcat Howto

答案 1 :(得分:0)

您必须在某处提供密码才能连接到数据库,几乎所有应用程序都是如此。这就是您使用其他安全层来防止人们以某种​​方式发现密码时能够使用该密码的原因。

通常,数据库服务器受到保护,仅允许来自其驻留的本地计算机的连接,或者可能是其他计算机的有限白名单。如果您没有使用相同的密码进行其他任何操作,那么窃取它的任何人都不会比以前更有权访问您的数据库,因为他们需要在服务器上使用密码。

如果有人设法登录您的服务器并且可以编辑文件,那么密码已经无关紧要并且具有足够的权限,他们无论如何都不需要它。

正如AmazingDreams所说,您倾向于从配置文件中读取它,该配置文件提供了一个位置,可以在引导应用程序和设置数据库连接时引用该位置。

答案 2 :(得分:0)

正如其他人所说,它必须存储在某个地方,通常最好的位置是配置文件。也可以设置无密码的MySQL帐户(显然,这在共享服务器上不是一个好主意,或者如果您允许远程访问mysql,或者可以公开访问phpmyadmin等工具)。

您还应锁定用于网站的用户帐户的权限,并使用其他用户执行管理任务。例如。如果您的网站只需要从几个表中读取数据,则只授予对这些表的SELECT访问权限。通常,网站用户不需要访问DROP或EMPTY表,也不需要INSERT到事件日志类型表中。

答案 3 :(得分:0)

当我必须共享代码时,我也对此感到担忧。在php中,我使用一种简单的方法,即使用任何简单的函数(如base64)编码密码,并且在代码而不是实际密码中,我编写编码的密码并在某处调用解码函数。如果有人真的试图找出答案,那么安全性并不高,但足以避免每个偶然观察者看到你的密码。这是在PHP中。

在Java 中,您可以采取进一步的方法。

  • 创建自定义编码和解码功能。
  • 编码功能不包含在项目中,您只需使用一次编码密码。
  • 您可以使用自定义解码功能创建一个小型库,并将其包含在您的项目中,因此任何人都无法看到解码逻辑。

在您的代码中,您只需编写编码密码,并调用解码函数,如下所示:

public static final String PASSWD = DecodingHelper.decode ("THE_ENCODED_STRING");