JNDI連接數據庫加密用戶名密碼


使用JNDI方式

這種方式,是由web服務器,實現了java.sql.datasource。由web服務器負責初始化數據源,創建connection,分配,管理connection。由於本身是由web服務器實現的功能,因此不需要在項目project中引入特別的jar包,但是需要在服務器的某些配置文件中增加相關的配置。

一共包含了三件事: 
1.JNDI配置數據源; 
2.加密JNDI配置的用戶名密碼; 
3.Spring配置JNDI; 

1. JNDI配置數據源 
運用JNDI技術會把數據源的配置信息從項目里分離出來添加到tomcat的context.xml(也可以是server.xml,只是server.xml修改后要重啟tomcat)以降低和項目的耦合度,如果配置信息需要修改就不用重新部署項目了。具體做法如下: 
    在tomcat的context.xml文件中的<Context>標簽中添加配置信息,如下: 
<Resource name="jdbc/mybatis"   
             auth="Container"   
             type="javax.sql.DataSource"   
factory=" EncryptionBasicDataSourceFactory" 
             driverClassName="com.mysql.jdbc.Driver"   
             url="jdbc:mysql://localhost:3306/hccgyb"   
             username="127%136%134%150%136%121%"   
             password="127%136%134%150%136%121%"   
             maxActive="20"   
             maxIdle="10"   
             maxWait="10000"/> 
這里說一下name屬性,這是數據源的名字,程序加載數據源就是按這個名字來找的,如果想深入了解,可以去網上了解一下lookup()這個方法(搜索java lookup)。另外同樣用綠色標識出來的factory屬性是為后面要做的加解密做的必要工作,如果不加密就可以刪掉這個屬性,它的具體配置會在加密用戶名密碼那一節說。 

2. 加密JNDI配置的用戶名密碼 
加密用戶名密碼是在網上拷了一段加密的代碼,然后跑加密程序把要加密的明文變成密文復制到上面的配置信息中。這里重點要說的是解密的工作: 
首先,要拿到配置文件中的用戶名和密碼。Tomcat啟動加載context.xml文件時會通過BasicDataSourceFactory(org.apache.tomcat.dbcp.dbcp. BasicDataSourceFactory,網上說要用tomcat安裝目錄下lib中的commons-dbcp-1.2.2.jar包里的BasicDataSourceFactory類,對比之后發現這兩個包下的BasicDataSourceFactory類功能是一樣的,只是其中導入的包稍有不同,可能是由於tomcat的版本不同吧!)這個類拿到數據源配置信息來給數據源各個屬性賦值,那么就可以通過繼承這個類並修改其中給數據源賦值的代碼部分來實現解密的工作。由於BasicDataSourceFactory類里大量的屬性方法都private的,所以重新建一個和它一樣的類(名字自己起 EncryptionBasicDataSourceFactory)而不是繼承。 
其次,把解密的方法添加到 EncryptionBasicDataSourceFactory這個類(新建一個java工程來創建這個類)。找到給用戶名密碼賦值的那段代碼,調用解密方法,保存,將工程打成jar包,放到tomcat的lib目錄下。另外, EncryptionBasicDataSourceFactory拷的是哪個jar包里BasicDataSourceFactory的內容,就要把哪個jar放到tomcat的lib目錄下。代碼片段如下: 
if (value != null) 
dataSource.setTestWhileIdle(Boolean.valueOf(value).booleanValue()); 
value = decrypt(properties.getProperty("password")); if (value != null) 
dataSource.setPassword(value); 
value = properties.getProperty("url"); 
if (value != null) 
dataSource.setUrl(value); 
value = decrypt(properties.getProperty("username")); if (value != null) 
dataSource.setUsername(value); 
value = properties.getProperty("validationQuery"); 
綠色標識出的decrypt()是加入的解密方法,和之前的加密方法是對應的! 
    最后,該說說配置信息中的factory屬性了。這個屬性就是用來指定tomcat配置數據源時所用的類了。注意,這里要寫類的全名! 

3.Spring配置JNDI 
在spring中配置了JNDI后,JNDI就是交由spring管理的一個組件,就不用在web.xml中配置了。配置代碼如下: 
<beanid="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean"> 
  <property name="jndiName"> 
<value>java:comp/env/ jdbc/mybatis</value> 
  </property> 
</bean> 
這里用綠色標出來的 jdbc/mybatis就是在tomcat的context.xml中配置的數據源的名字。 
現在三件工作就做完了,其中用到的打jar包,反編譯之類的網上資料是很多的,這里就不重復了。 如果想把要求做的更高一點,可以用到混淆加密


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM