为Hibernate配置文件加密的三套解决方案(一)
Hibernate配置文件hibernate.cfg.xml中存放了我们连接数据库的相关信息,其中设计到许多数据库的敏感信息,比如连接地址,用户名和密码,有时候我们交由发布组进行发布时并不希望他们看到数据库的连接密码,就需要对hibernate配置文件中的部分信息进行加密,我在解决这一问题中实践了三种方法,第一种是重载连接供应器,第二种是使用Hibernate官方推荐的Jasypt,第三种其实算不上是加密,而是使用WebLogic连接池将相关信息放在WebLogic的配置中,下面会具体阐述这三种方法。
第一种重载连接供应器:
这种方法是我在网上看到的,原文连接是:
http://blog.csdn.net/sdbany/archive/2008/10/23/3132809.aspx
但是在实际使用的时候发现代码有问题,可能是作者没有贴全,所以有些功能无法实现,于是我重新写了代码。
首先创建一个连接供应器,配置文件里的参数解释都是此类负责,所以,只要在此类中进行密文解密即可。
import java.util.Properties;import org.hibernate.HibernateException;import org.hibernate.cfg.Environment;import org.hibernate.connection.DriverManagerConnectionProvider;public class CustomDriverManagerConnectionProvider extendsDriverManagerConnectionProvider {public CustomDriverManagerConnectionProvider() {super();}@Overridepublic void configure(Properties props) throws HibernateException{String user = props.getProperty(Environment.USER);String password = props.getProperty(Environment.PASS);props.setProperty(Environment.USER, SecUtil.decrypt(user));props.setProperty(Environment.PASS, SecUtil.decrypt(password));super.configure(props);}}/** * AES加密工具 * * @author Bany * * @version 创建时间:2008-8-5 上午10:58:16 * */public class SecUtil { private static byte[] keybytes = { 0x31, 0x32, …… }; public static void main(String[] args) throws Exception { String e1 = encrypt("newpassword"); System.out.println(e1); String e2 = decrypt(e1); System.out.println(e2); } /** * 加密 * @param value * @return */ public static String encrypt(String value) { String s=null; int mode = Cipher.ENCRYPT_MODE; try { Cipher cipher = initCipher(mode); byte[] outBytes = cipher.doFinal(value.getBytes()); s = String.valueOf(Hex.encodeHex(outBytes)); } catch (Exception e) { e.printStackTrace(); } return s; } /** * 解密 * @param value * @return */ public static String decrypt(String value) { String s = null; int mode = Cipher.DECRYPT_MODE; try { Cipher cipher = initCipher(mode); byte[] outBytes = cipher.doFinal(Hex.decodeHex(value.toCharArray())); s = new String(outBytes); } catch (Exception e) { e.printStackTrace(); } return s; } private static Cipher initCipher(int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException{ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); Key key = new SecretKeySpec(keybytes, "AES"); cipher.init(mode, key); return cipher; }}<property name="connection.username">c59cd98</property><property name="connection.password">68e32593ea5943a6a</property><property name="connection.provider_class">com.CustomDriverManagerConnectionProvider</property>