`
ahuaxuan
  • 浏览: 634509 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

给hibernate配置文件加密 解密的方案

阅读更多
如何给工程中的配置文件加密 解密
之前有人问过hibernate密码问题,大家都没有给出一个具体的解决方案,所以我就看了一下代码,把我的想法和实现拿出来和大家讨论一下。

我现在的环境是spring+hibernate,但是这并不影响这个加密解密的问题,其他环境应该是略有不同,但是思路肯定是一样的。

总体思路:在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。
步骤1
使用java的中cipher类并使用DES(对称加密算法)算法对明文进行加密
````````````````这里如何使用cipher类和DES算法的原理可以上网查找,我懒得写了,如果大家真的也怕麻烦自己去找的话我再写一个贴出来吧


修改:我随便写了一个类,大家看着改吧,我没有测试过

public class DESUtil {
	
	public static void main(String[] args){
		try {
			if(args[0].equals("-genKey")){
				generateKey(args[1]);
			}else{
				
				//if (args[0].equals("-encrypt"))encrypt();
					
				//else decrypt();	
			}
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static String encrypt(String plainText, String encryptString, File keyFile)throws IOException, ClassNotFoundException,GeneralSecurityException{
		ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(keyFile));
		int mode = Cipher.ENCRYPT_MODE;
		Key key = (Key)keyIn.readObject();	
		keyIn.close();
		
		InputStream in = new FileInputStream(plainText);
		OutputStream out = new FileOutputStream(encryptString);
		
		Cipher cipher = Cipher.getInstance("DES");
		cipher.init(mode, key);
		
		doEncryptAndDecrypt(in, out, cipher);
		
		String result = out.toString();
		System.out.print(result);
		in.close();
		out.close();
		return result;
	}
	
	public static String decrypt(String encryptString, String plainText, File keyFile)throws IOException, ClassNotFoundException,GeneralSecurityException{
		ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(keyFile));
		int mode = Cipher.DECRYPT_MODE;
		Key key = (Key)keyIn.readObject();	
		keyIn.close();
		
		InputStream in = new FileInputStream(encryptString);
		OutputStream out = new FileOutputStream(plainText);
		
		Cipher cipher = Cipher.getInstance("DES");
		cipher.init(mode, key);
		
		doEncryptAndDecrypt(in, out, cipher);
		
		String result = out.toString();
		System.out.print(result);
		in.close();
		out.close();
		return result;
	}
	
	public static void doEncryptAndDecrypt(InputStream in, OutputStream out, Cipher cipher)throws IOException, GeneralSecurityException{
		int blockSize = cipher.getBlockSize();
		int outputSize = cipher.getOutputSize(blockSize);
		
		byte[] inBytes = new byte[blockSize];
		byte[]	outBytes = new byte[outputSize];
		
		int inLength = 0;
		boolean more = true;
		
		while(more){
			inLength = in.read(inBytes);
			if(inLength == blockSize){
				int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
				out.write(outBytes,0,outLength);
			}
			else more = false;
		}
		
		if(inLength>0) outBytes = cipher.doFinal(inBytes, 0, inLength);
		else outBytes = cipher.doFinal();
		
		out.write(outBytes);
		
	}
	
	public static void generateKey(String path) throws Exception{
		KeyGenerator keygen = KeyGenerator.getInstance("DES");
		SecureRandom random = new SecureRandom();
		
		keygen.init(random);
		SecretKey key = keygen.generateKey();
		
		ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(path));
		out.writeObject(key);
		out.close();
	}

}


通过以上的encrypt方法得到一个密码的密文(一般的密码是明文,作为参数传进去可以得到对应的密文),比如说21sadf25

步骤2
将加密后的密文添加到配置文件中

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/>
        <property name="username" value="root"/>
        <property name="password" value="21sadf25"/>
        <property name="maxActive" value="100"/>
        <property name="whenExhaustedAction" value="1"/>
        <property name="maxWait" value="120000"/>
        <property name="maxIdle" value="30"/>
        <property name="defaultAutoCommit" value="true"/>
    </bean>  
 

步骤3
继承spring的LocalSessionFactoryBean类,override其setDataSource方法,将dataSource的password取出,解密后再赋值。
为什么要这么做呢,因为datasource是localsessionFactoryBean的一个属性,在注入dataSource时将其密码解密是比较恰当的。所以选择这个setDataSource方法进行override。假设我们使用的dbcp连接池
代码如下:(类名是AhuaXuanLocalSessionFactoryBean)
public void setDataSource(DataSource dataSource) {
String password = (BasicDataSource)dataSource.getPassword();
//通过cipher类进行解密
String decryPassword = DESUtil.decrypt(password);
dataSource.setPassword(decryPassword);
		this.dataSource = dataSource;
	}
配置如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate.AhuaXuanLocalSessionFactoryBean">
                    <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
</bean>
之前robbin说的DataSourceFactoryBean那个类我在spring1.2.8中没有找到,但是我觉得改造LocalSessionFactoryBean也不错

这样就完成了一个我们的目标,以上代码是随便写的,没有经过测试,有兴趣的同学可以试一下

作者:张荣华,未经作者同意不得随意转载!

分享到:
评论
11 楼 chinayx 2007-06-21  
得到服务器admin权利后,直接重置数据库密码呢?

对服务器段程序,有必要做得这么麻烦吗?
10 楼 ahuaxuan 2007-06-04  
Michael.zhl 写道
没必要吧,人家要是连你的配置文件都看了.还有什么干不了呢.安全问题应该从服务器整体考虑.

你看了加密之后的配置文件,你能干什么?

to楼下
chinayx 写道
得到服务器admin权利后,直接重置数据库密码呢?

对服务器段程序,有必要做得这么麻烦吗?

你如何得到admin的权利,你得到服务器的admin权利后你如何重置数据库密码,
有一点你要知道jboss天生就支持这样做,你可以到论坛上搜一下。

如果你对某个事物不是很了解最好是先研究再发言
9 楼 Michael.zhl 2007-06-04  
没必要吧,人家要是连你的配置文件都看了.还有什么干不了呢.安全问题应该从服务器整体考虑.
8 楼 抛出异常的爱 2007-05-29  
加密的作用就是让黑客一次破解的周期延长。。。。并提高发现可能
而不是为了让他破不开。。。

至少要大于24小时。。。
那样的话。。。不用24小时守着电脑了。
7 楼 spiritfrog 2007-05-29  
这样也足够用了,加密过的密码放在配置文件中,就算看得到有什么关系呢?
这里讨论的也不是加密的方案如何如何安全可靠,重点还是能够在创建datasource的时候得到正确的密码明文, 黑客入侵就扯得远了嘛.
6 楼 ahuaxuan 2007-04-23  
小开ye 写道
我还记得四年前我想通过一些非常手法来获取数据库的口令,却被一个同事批评了一通,他说,既然是bs模式,就没有必要在服务器上去加密数据库口令了;因为如果有人能进入服务器了,你还能阻止他什么?
能入侵服务器的黑客就一定能知道服务器上数据的密码吗,他可以在应用程序的配置文件中找数据库密码,如果应用程序的数据库password被保护了,至少在一定程度上阻止了他的步伐,如果他水平很高,对加密解密很了解,说不定能破解(或者用其他什么工具直接破解数据库密码,我猜的),但前提的他是黑客中的高手,但是事实告诉我们黑客中的菜鸟也不少,只会用点小工具去扫描扫描端口等等,不同的客户不同的应用是需要不同的安全级别的
5 楼 remanhu 2007-04-17  
用jndi是最安全的,其它方式都可能有问题,即使是通过混淆代码,一样是有办法解开的
4 楼 weiqingfei 2007-04-17  
可以参考一下.net配置文件的加密方式,把加密解密委托给别的程序。
3 楼 小开ye 2007-04-16  
我还记得四年前我想通过一些非常手法来获取数据库的口令,却被一个同事批评了一通,他说,既然是bs模式,就没有必要在服务器上去加密数据库口令了;因为如果有人能进入服务器了,你还能阻止他什么?
当然日常的安全性我们还是需要考虑的。
2 楼 jamesby 2007-04-13  
我在想一个问题,能不能想办法对setPassword方法进行拦截器拦截,这样一来任何需要加密的地方都拦截一下就可以了.
1 楼 ahuaxuan 2007-04-13  
lixuehui 写道
没觉得安全性高在哪,真实密码照样在程序中出现.

很容易就被破解了,照样可以得到数据库的真实密码

不可取




你发布工程的时候不能混淆一下吗,我还没有见不在代码中读取密码的安全应用呢

相关推荐

    给hibernate配置文件加密解密的方案

    在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。

    SpringMVC整合Hibernate前端采用miniUI项目

    系统采用SpringMVC整合Hibernate,前端采用Jquery的miniUI做简单展示,集合了常用的web程序功能,增删改查,分页,上传文件,下载文件,freemark导出word,导出excel,spring定时器(三种配置写法都有简单介绍),...

    jasypt-1.9.3.jar

    &gt;Jasypt是一个Java库,可以使开发者不需太多操作来给Java项目添加基本加密功能,而且不需要知道加密原理。 &gt;根据Jasypt官方文档,Jasypt可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信、创建完整检查...

    java文集

    SWT可交互式Browser控件 JDK配置(注意) RIA简介(第一部分) 在 Eclipse 中嵌入 NASA World Wind Java SDK, 用3DES加密解密 BadPaddingException Web Service 打包生成aar文件 什么是反射...

    java源码包---java 源码 大量 实例

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    java源码包2

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道...

    java源码包3

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道...

    java源码包4

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道...

    JAVA上百实例源码以及开源项目

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...

    JAVA上百实例源码以及开源项目源代码

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    JAVA高并发高性能高可用高扩展架构视频教程

    类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码防止恶意登陆) 动态页面的静态化处理 图片上传技术 在springMVC中实现原始的Excel...

    java开源包1

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

    java开源包11

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

    java开源包2

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

    java开源包3

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

    java开源包6

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

    java开源包5

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

Global site tag (gtag.js) - Google Analytics