JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
作者 Re:怎麼幫Hibernate配置檔中的帳號、密碼加密? [Re:godspeed1979]
godspeed1979





發文: 9
積分: 0
於 2011-09-02 17:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
對Hibernate設定檔hibernate.cfg.xml 中帳號密碼加密的方法

如果你想要為Hibernate設定檔hibernate.cfg.xml中的帳號、密碼做加密,在此建議你使用Jasypt套件(http://www.jasypt.org/index.html),下載jar檔並解壓縮後,可於bin目錄下看到以下檔案:



其中,encrypt.bat與decrypt.bat是在DOS下所要使用的檔案;前者讓使用者將一段明文文字編碼為密文、後者則可以將密文解碼為明文,而這兩個動作都需要額外的一個參數password來進行編碼。這裡的password並非真正的密碼,只是Jasypt在加密過程當中所使用的一個金鑰而已。

一、加密、解密測試
假設密碼字串為ABCDE,那麼在命令列模式中,於Jasypt的bin目錄下執行以下命令,就可以看到Jasypt產生的密碼:



得到加密過的密碼字串為UBnWxUb0Bwnut+jDYpjmdA==。

而解碼過程如下:



二、修改hibernate.cfg.xml中的帳號、密碼
原本在Hibernate當中的帳號、密碼如下:

1
2
<property name="connection.username">ABCDE</property>
<property name="connection.password">ABCDE</property>


若要同時將帳號、密碼加密的話,就把ABCDE字串換成Tbq1m3iKclAYkSk2vJ1B0g==字串,並且要加在ENC( )當中,如下所示:

1
2
<property name="connection.username"> ENC(UBnWxUb0Bwnut+jDYpjmdA==)</property>
<property name="connection.password"> ENC(UBnWxUb0Bwnut+jDYpjmdA==)</property>


三、於Hibernate設定檔中註冊(指定)解碼器
為了使Hibernate在運作當中可以利用加密過的帳號、密碼連接資料庫,我們必須讓它知道要使用哪一個註冊過的解碼器。因此,在上述帳號、密碼之前,再加上兩行設定如下:

1
2
3
4
5
<property name="connection.provider_class">
org.jasypt.hibernate.connectionprovider.EncryptedPasswordC3P0ConnectionProvider
</property>
 
<property name="connection.encryptor_registered_name">stringEncryptor</property>


由於本專案是使用C3P0來作為Hibernate的connection pool工具,因此"connection.provider_class"這個屬性是用來取代C3P0的"connection.provider_class"屬性的。所以,必須將以下屬性註解掉:

1
2
3
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>


四、在取得Session Factory Instance之前的程式碼處理:
為了使Jasypt可以在取得連線之前發生作用,我們必須在應用程式取得Session Factory之前加上以下程式碼:

1
2
3
4
5
//使用Jasypt加密
  StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();
  HibernatePBEEncryptorRegistry registry = HibernatePBEEncryptorRegistry.getInstance();
  registry.registerPBEStringEncryptor("stringEncryptor", strongEncryptor);
  strongEncryptor.setPassword("project_A ");


舉例來說,原本的程式碼如下:
1
2
3
4
5
6
7
8
  //未使用Jasypt加密
   static {
     try {
       mySessionFactory = new Configuration().configure().buildSessionFactory();
     } catch (Throwable ex) {
       throw new ExceptionInInitializerError(ex);
     }
   }


修改後如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  static {
    try {
      Configuration configuration = new Configuration().configure();
 
      //使用Jasypt解密
      StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();
      HibernatePBEEncryptorRegistry registry = 
      HibernatePBEEncryptorRegistry.getInstance();
      registry.registerPBEStringEncryptor("stringEncryptor", strongEncryptor);
      strongEncryptor.setPassword("project_A");
 
      mySessionFactory = configuration.buildSessionFactory();
    } catch (Throwable ex) {
      throw new ExceptionInInitializerError(ex);
    }
  }


在以上程式當中,明文的密碼都是不會出現的。


reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
3413 怎麼幫Hibernate配置檔中的帳號、密碼加密? godspeed1979 271 2011-06-08 09:47
3356 Re:怎麼幫Hibernate配置檔中的帳號、密碼加密? koji 184 2011-06-08 10:05
4134 Re:怎麼幫Hibernate配置檔中的帳號、密碼加密? godspeed1979 3106 2011-09-02 17:04
2949 Re:怎麼幫Hibernate配置檔中的帳號、密碼加密? benjumin 18 2012-07-27 14:10
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8