夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

          Hibernate配置文件hibernate.cfg.xml中存放了我們連接數據庫的相關信息,其中設計到許多數據庫的敏感信息,比如連接地址,用戶名和密碼,有時候我們交由發布組進行發布時并不希望他們看到數據庫的連接密碼,就需要對hibernate配置文件中的部分信息進行加密,我在解決這一問題中實踐了三種方法,第一種是重載連接供應器,第二種是使用Hibernate官方推薦的Jasypt,第三種其實算不上是加密,而是使用WebLogic連接池將相關信息放在WebLogic的配置中,下面會具體闡述這三種方法。

          第一種重載連接供應器:
          這種方法是我在網上看到的,原文連接是:
          http://blog.csdn.net/sdbany/archive/2008/10/23/3132809.aspx

          但是在實際使用的時候發現代碼有問題,可能是作者沒有貼全,所以有些功能無法實現,于是我重新寫了代碼。

          首先創建一個連接供應器,配置文件里的參數解釋都是此類負責,所以,只要在此類中進行密文解密即可。

          Java代碼
          1. import java.util.Properties;   
          2.   
          3. import org.hibernate.HibernateException;   
          4. import org.hibernate.cfg.Environment;   
          5. import org.hibernate.connection.DriverManagerConnectionProvider;   
          6.   
          7. public class CustomDriverManagerConnectionProvider extends  
          8.         DriverManagerConnectionProvider {   
          9.   
          10.     public CustomDriverManagerConnectionProvider() {   
          11.         super();   
          12.     }   
          13.        
          14.     @Override  
          15.     public void configure(Properties props) throws HibernateException{   
          16.         String user = props.getProperty(Environment.USER);   
          17.         String password = props.getProperty(Environment.PASS);   
          18.         props.setProperty(Environment.USER, SecUtil.decrypt(user));   
          19.         props.setProperty(Environment.PASS, SecUtil.decrypt(password));   
          20.         super.configure(props);   
          21.     }   
          22.        
          23. }  

          再寫一個類,使用AES負責字符串的加密與解密這里我們參照原作者的方法
          Java代碼
          1. /**  
          2.  * AES加密工具  
          3.  *   
          4.  * @author Bany  
          5.  *   
          6.  * @version 創建時間:2008-8-5 上午10:58:16  
          7.  *   
          8.  */  
          9.   
          10. public class SecUtil {   
          11.   
          12.     private static byte[] keybytes = { 0x310x32, …… };   
          13.   
          14.     public static void main(String[] args) throws Exception {   
          15.         String e1 = encrypt("newpassword");   
          16.         System.out.println(e1);   
          17.         String e2 = decrypt(e1);   
          18.         System.out.println(e2);   
          19.     }   
          20.   
          21.     /**  
          22.      * 加密  
          23.      * @param value  
          24.      * @return  
          25.      */  
          26.     public static String encrypt(String value) {   
          27.            
          28.         String s=null;   
          29.   
          30.         int mode = Cipher.ENCRYPT_MODE;   
          31.   
          32.         try {   
          33.             Cipher cipher = initCipher(mode);   
          34.   
          35.             byte[] outBytes = cipher.doFinal(value.getBytes());   
          36.   
          37.             s = String.valueOf(Hex.encodeHex(outBytes));   
          38.         } catch (Exception e) {   
          39.             e.printStackTrace();   
          40.         }   
          41.   
          42.         return s;   
          43.     }   
          44.   
          45.     /**  
          46.      * 解密  
          47.      * @param value  
          48.      * @return  
          49.      */  
          50.     public static String decrypt(String value) {   
          51.   
          52.         String s = null;   
          53.   
          54.         int mode = Cipher.DECRYPT_MODE;   
          55.   
          56.         try {   
          57.             Cipher cipher = initCipher(mode);   
          58.   
          59.             byte[] outBytes = cipher.doFinal(Hex.decodeHex(value.toCharArray()));   
          60.   
          61.             s = new String(outBytes);   
          62.         } catch (Exception e) {   
          63.             e.printStackTrace();   
          64.         }   
          65.   
          66.         return s;   
          67.     }   
          68.        
          69.     private static Cipher initCipher(int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException{   
          70.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");   
          71.         Key key = new SecretKeySpec(keybytes, "AES");   
          72.         cipher.init(mode, key);   
          73.         return cipher;   
          74.     }   
          75. }  

          當然,你也可以使用自己寫的加密方法,或者是Java官方推薦的一些加密方法
          調用SecUtil.encrypt的方法,把用戶密碼加密生成密文,然后根據密文修改hibernate.cfg.xml文件
          Xml代碼
          1. <property name="connection.username">c59cd98</property>  
          2. <property name="connection.password">68e32593ea5943a6a</property>  
          3. <property name="connection.provider_class">com.CustomDriverManagerConnectionProvider</property>  
          posted on 2010-05-31 17:07 HUIKK 閱讀(2329) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 双流县| 木兰县| 澄迈县| 勃利县| 施甸县| 交口县| 香港| 新巴尔虎左旗| 手机| 绥芬河市| 柘城县| 葵青区| 天镇县| 仪征市| 闻喜县| 兰西县| 克拉玛依市| 邵阳县| 珠海市| 邓州市| 兴化市| 白水县| 孟津县| 漠河县| 满洲里市| 巩留县| 新兴县| 五常市| 塘沽区| 梅州市| 区。| 呼玛县| 赫章县| 抚顺市| 仙游县| 南乐县| 龙门县| 城口县| 布尔津县| 霍州市| 房产|