提供 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 驱动程序密码的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章