差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
下次修改 Both sides next revision
java:jasypt [2016/01/14 21:02]
tony
java:jasypt [2016/01/14 23:47]
tony [Problem]
行 2: 行 2:
 ====== Jasypt ====== ====== Jasypt ======
 ===== Problem ===== ===== Problem =====
-使用這個API的目的主要是為了無痛去加解密資料庫的某個欄位,且它支援Hibernate、Spring的整合方式。+使用這個API的目的主要是為了無痛去加解密資料庫的某個欄位,且它支援Hibernate、Spring的整合方式。但最後發現,要無痛是很困難的,除非只是很單純的加密像密碼的東西
 ===== How to? ===== ===== How to? =====
 ==== 安裝Java Cryptography Extension (JCE) ==== ==== 安裝Java Cryptography Extension (JCE) ====
行 13: 行 13:
 </​code>​ </​code>​
 === 最簡單的方式 === === 最簡單的方式 ===
-只要在hbm檔內,將你要加密的欄位設定一下就搞定了。 +只要在hbm檔內,將你要加密的欄位設定一下就搞定了。\\ 
-\\Hibernate設定:​+Hibernate設定:​
 <code xml> <code xml>
 <​hibernate-mapping>​ <​hibernate-mapping>​
行 30: 行 30:
 </​hibernate-mapping>​ </​hibernate-mapping>​
 </​code>​ </​code>​
 +支援的algorithm可以參考此[[http://​www.jasypt.org/​cli.html|連結]]。
 === 使用自己的Encryptor === === 使用自己的Encryptor ===
 Hibernate設定:​ Hibernate設定:​
行 79: 行 80:
 </​code>​ </​code>​
 ==== Known Issue ==== ==== Known Issue ====
-目前已知使用Hibernate設定criteria搜尋,又或者是HQL搭配NameParam的方式,都會經過Encryptor。但如果使用Jasypt所提供的Password Base相關的加密方式,所產生的密文每次都會不同。如果你所加密的欄位是要搜尋的對象,變成必須自行處理,也可能因此產生performance問題。如果自行寫Encryptor去產生一樣的密文,就會比較不安全。該怎麼決擇就由你自行決定了。\\ +目前已知使用Hibernate設定criteria搜尋,又或者是HQL搭配NameParam的方式,都會經過Encryptor。但有以下問題:​ 
-還有無法使用模糊比對去找加密過後的欄位。因為片段加密後,不一定是密文中的片段。+  - 密文不固定: ​使用Jasypt所提供的Password Base相關的加密方式,所產生的密文每次都會不同。如果加密的欄位是要搜尋的對象,變成必須自行處理,也可能因此產生效能問題。如果自行寫Encryptor去產生一樣的密文,就會比較不安全。該怎麼決擇就由你自行決定了。 
 +  ​- ​無法模糊比對:​ 難以使用模糊比對去找加密過後的欄位。因為片段加密後,不一定是密文中的片段。 
 +  - 加密型態非預期:​ 舉例來說,物件類別為long,而DB為big int。而Jasypt提供的類別為EncryptedLongAsStringType,會將內容轉為string。我的測試是MySQL正常,但Postgres會有無法insert的問題;而Jasypt文件就有提到,Long對應的SQL type為VARCHAR,​ CLOB, TEXT。因此如果要支援,非常可能要自己做Encryptor
 ===== Reference ===== ===== Reference =====
   * [[http://​www.jasypt.org/​hibernate.html|Jasypt與Hibernate的整合]]   * [[http://​www.jasypt.org/​hibernate.html|Jasypt與Hibernate的整合]]