提供 MySQL JDBC 驱动程序密码的最佳实践

Posted

技术标签:

【中文标题】提供 MySQL JDBC 驱动程序密码的最佳实践【英文标题】:Best practice to provide MySQL JDBC driver password 【发布时间】:2014-05-02 21:05:34 【问题描述】:

我在Tomcat7 服务器中部署了JSP Web 应用程序,该服务器使用mysql 作为数据库。在数据库连接中,我目前提供如下明文用户名和密码。

Connection conn = DriverManager.getConnection("jdbc:mysql://hostname:3306/schema", "user", "password");

作为安全要求,我不能在我的代码中使用纯文本密码,也不能使用配置文件来存储信息,因此所有内容都必须在某个数据库中。

Q1至于这个问题,我可以为连接字符串中的密码字段提供哈希输入吗?

Q2 如果我不能使用基于文件的配置方法,那将是存储敏感信息的最佳方式。?

【问题讨论】:

java.dzone.com/articles/storing-passwords-java-web希望对您有所帮助 @Shriram 它解释了我认为的散列用户密码。我需要知道是否可以在 JDBC 连接字符串中使用哈希输入作为密码字段。 cfg 中的哈希(您可以用来进行身份验证)不会比普通密码更安全(私钥、对称加密密码存储也是如此……)。你应该问问写需求的人。 @Vatev 谢谢你的信息。但我能知道 JDBC 驱动程序支持密码字段的散列输入吗? 我的意思是,即使这样做(这对我来说毫无意义)也没关系。您将在某处存储哈希(与密码相同),有权访问它的攻击者仍然可以使用它进行身份验证。 【参考方案1】:

最好的方法是在 tomcat 中定义 JDBC 数据存储,然后在您的 Web 应用程序中查找它。以下示例无耻地从 tomcat documentation 复制。这样,您的应用程序中就没有任何密码。配置由 tomcat 管理员完成,而不是 Web 应用程序开发人员。

上下文:

<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

<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>

test.jsp

<sql:query var="rs" dataSource="jdbc/TestDB">
   select id, foo, bar from testdata
</sql:query>

小服务程序

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

关于您的安全要求:这更难,因为那里的密码也是明文。您可以限制访问权限,以便只有 Web 容器可以读取它。加密密码不适用于对称密码,因为攻击者也可以获得它们。还有非对称密码——他也可以获得解码密钥。所以你必须设置攻击者看不到配置文件内容的环境。如果他是root,无论如何一切都会丢失。

【讨论】:

关于“加密”密码,请参阅 Tomcat 常见问题解答wiki.apache.org/tomcat/FAQ/Password

以上是关于提供 MySQL JDBC 驱动程序密码的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Web应用程序中安全问题的最佳实践

Spring JDBC 连接池最佳实践

在 JDBC 中编写 SQL 查询的最佳实践是啥

在 git 存储库中处理密码的最佳实践是啥?

Spring对JDBC的最佳实践--上

ASP.NET MVC 中密码重置的最佳实践