使用這個API的目的主要是為了無痛去加解密資料庫的某個欄位,且它支援Hibernate、Spring的整合方式。但最後發現,要無痛是很困難的,除非只是很單純的加密像密碼的東西。
如果出現Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File錯誤訊息,請自行到Oracle官網下載JCE包(JCE for Java8),並安裝到%JAVA_HOME%/jre/lib/security中。如果有問題,可以設定JAVA_HOME環境變數再試試看。 (JCE包內容有US_export_policy.jar與local_policy.jar)
我的Ivy.xml相依於此兩個libraries:
<dependency org="org.jasypt" name="jasypt" rev="1.9.2"/> <dependency org="org.jasypt" name="jasypt-hibernate4" rev="1.9.2"/>
只要在hbm檔內,將你要加密的欄位設定一下就搞定了。
Hibernate設定:
<hibernate-mapping> <typedef name="encryptedString" class="org.jasypt.hibernate4.type.EncryptedStringType"> <param name="algorithm">PBEWithMD5AndTripleDES</param> <param name="password">jasypt</param> <param name="keyObtentionIterations">1000</param> </typedef> <class name="org.tonylin.fun.tonyaccounts" table="tony_accounts"> <!-- Other items --> <property name="password" type="encryptedString"> <column name="PASSWORD" not-null="true" /> </property> </class> </hibernate-mapping>支援的algorithm可以參考此連結。
Hibernate設定:
<hibernate-mapping> <typedef name="encryptedString" class="org.jasypt.hibernate4.type.EncryptedStringType"> <param name="encryptorRegisteredName">tonyEncryptor</param> </typedef> <class name="org.tonylin.fun.tonyaccounts" table="tony_accounts"> <!-- Other items --> <property name="password" type="encryptedString"> <column name="PASSWORD" not-null="true" /> </property> </class> </hibernate-mapping>Spring設定:
<bean id="strongEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> <property name="algorithm"> <value>PBEWithMD5AndTripleDES</value> </property> <property name="password"> <value>jasypt</value> </property> <property name="keyObtentionIterations"> <value>1000</value> </property> </bean> <bean id="hibernateStringEncryptor" class="org.jasypt.hibernate4.encryptor.HibernatePBEStringEncryptor"> <property name="registeredName"> <value>tonyEncryptor</value> </property> <property name="encryptor"> <ref bean="strongEncryptor" /> </property> </bean>
如果有使用PowerMock做測試,記得ignore掉這幾個項目。
@PowerMockIgnore({ "javax.crypto.*", "javax.security.*" })
目前已知使用Hibernate設定criteria搜尋,又或者是HQL搭配NameParam的方式,都會經過Encryptor。但有以下問題: