2014-03-25 38 views
2

我有JSP網絡應用程序部署在使用MySQL作爲數據庫的Tomcat7服務器中。在數據庫連接中,我目前提供明文的用戶名和密碼如下。提供MySQL JDBC驅動程序密碼的最佳做法

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

作爲安全性的要求,我不能在我的代碼中使用明文密碼,我不能使用配置文件來存儲信息醚所以一切都必須在數據庫中的某個地方。

Q1至於這個問題,我可以提供連接字符串密碼字段的散列輸入。

Q2如果我不能使用基於文件的配置方法,這將是存儲敏感信息的最佳方式。

+0

http://java.dzone.com/articles/storing-passwords-java-web希望它有幫助 – Shriram

+0

@Shriram它解釋了我認爲散列用戶密碼。我需要知道我可以在JDBC連接字符串中使用密碼字段的散列輸入。 – Sajirupee

+1

cfg中的散列(可用於驗證)不會比普通密碼更安全(對於私鑰,對稱加密密碼存儲也是如此)。你應該問問誰寫了關於它的要求的人。 – Vatev

回答

3

最好的方法是在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> 

的servlet

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

關於您的安全要求:這很難,因爲密碼也是明文。您可以限制訪問權限,以便只有Web容器可以讀取它。加密密碼不適用於對稱密碼,因爲攻擊者也可以得到它們。而且不對稱的密碼 - 他也可以獲得解碼密鑰。所以你必須設置攻擊者不會看到配置文件內容的環境。如果他是根,那麼一切都會丟失。

+1

關於'加密'密碼,請參閱Tomcat常見問題http://wiki.apache.org/tomcat /常見問題/密碼 –

+0

我完全同意。 –

+0

非常感謝。 :) – Sajirupee