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

» JWorld@TW » Object Relational Mapping » Hibernate  

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





發文: 9
積分: 0
於 2011-06-08 09:47 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
因應資安的需求,現在連僅僅跑批次用的程式碼,如果有讀取資料庫帳號密碼資訊以

連接資料庫的話,這些帳號密碼都不得使用明碼,通通必須加密過。

昨天Google了一個下午,大概是Jasypt這個函式庫比較被推薦,但沒有找到比較合適

的範例。不知道有沒有哪位大大可以提供這樣的範例呢?

我的需求如下:

1. 純粹的使用Hibernate而已,沒有整合Spring。

2. hibernate.cfg.xml 中的帳號、密碼皆須加密。

3. 這是個純Java專案,非Web、Web service專案。


reply to postreply to post
作者 Re:怎麼幫Hibernate配置檔中的帳號、密碼加密? [Re:godspeed1979]
koji

秒速5センチメートル

站長

發文: 8420
積分: 19
於 2011-06-08 10:05 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
所以是設定檔需要加密?
不用透過Jasypt 也可以, 但是看他api用起來比較簡單
網站上不是以經有說明了, 你動手寫過或知道自己的問題點在哪嗎?

沒有完整sample就寫不出來嗎?先自己動手再把問題點提出吧

他javadoc的EncryptedPasswordDriverManagerConnectionProvider看了沒

koji


koji edited on 2011-06-08 10:09
reply to postreply to post
JCConf Taiwan 2015 開始售票了!!
Facebook上的TWJUG社團,歡迎加入
作者 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
作者 Re:怎麼幫Hibernate配置檔中的帳號、密碼加密? [Re:godspeed1979]
benjumin





發文: 21
積分: 0
於 2012-07-27 14:10 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
感謝您的分享,再找個時間來試看看Smile

reply to postreply to post
» JWorld@TW »  Object Relational Mapping » Hibernate

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

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8