spring datasource 密码加密后运行时解密的解决办法

摘要: 在做项目的时候,有些客户要求不能直接明文暴露密码,因此需要对密码进行加密处理。当然很多项目也没有这样的要求,原因也很简单,要查看密码需要登录服务器,如果能登录服务器的人,权限肯定不一般。当然我今天要记录的就是需要加密的时候怎么处理

在做项目的时候,有些客户要求不能直接明文暴露密码,因此需要对密码进行加密处理。当然很多项目也没有这样的要求,原因也很简单,要查看密码需要登录服务器,如果能登录服务器的人,权限肯定不一般。当然我今天要记录的就是需要加密的时候怎么处理。
一般我们配置spring datasource 可能会类似如下


		
		
		
		
			

还有另外一种方式,就是读取properties 方式,这种更常见了.比如

		
	
	

这种情况下,数据库信息和密码保存在 database.properties 中。这种方式用的比较多,这里就用这种方式说明, 我们变更配置为如下:

	
		
		   
		       
		       file:D:/database.properties 
		   
		
		
		    
		
		
	


你会看到有一个 com.yihaomen.propertiesextend.MyPropertiesPersist 类,这就是我们需要扩展的类了。扩展为如下:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

import org.springframework.util.DefaultPropertiesPersister;

public class MyPropertiesPersist extends DefaultPropertiesPersister {
	
	public void load(Properties props, InputStream is) throws IOException{
	
	Properties properties = new Properties(); 
	properties.load(is); 
	
	if ( (properties.get("password") != null) ){
		/*这里通过解密算法,得到你的真实密码,然后写入到properties中*/
//		String password = getRealPassword( decrypter , properties.getProperty("password") );	
//		properties.setProperty("password" , password); 	
	}	
	OutputStream outputStream = null; 
	try {
		outputStream = new ByteArrayOutputStream(); 
	    properties.store(outputStream, ""); 
	    is = outStream2InputStream(outputStream); 
	    super.load(props, is);
	}catch(IOException e) { 
		throw e;
	}finally {
		outputStream.close();
	}
    }
	
	
	private InputStream outStream2InputStream(OutputStream out){
		ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
		bos = (ByteArrayOutputStream) out ;
		ByteArrayInputStream swapStream = new ByteArrayInputStream(bos.toByteArray()); 
		return swapStream;
	}
}


再次运行程序,你会发现 密码已经被解密了。datasource 被正确的密码注入,程序运行正常. 当然这只是其中一种方法用来扩展解密处理properties的情况,其实还可以采用如下方法:
1. 比较暴力的方法,直接修改spring 源代码,只修改处理properties 这一块.
2. 也是比较暴力的方法, 如果用了c3p0 的数据源,也可以修改源代码。
3. 比较推荐的方法, 扩展 spring 的 PreferencesPlaceholderConfigurer 这个类进行处理,我觉得比较耗
4. 采用上面介绍的方法,同时也是我在项目中用到的方法.

备注:如果想参考加密解密的,可以参考这篇文章 http://www.yihaomen.com/article/java/247.htm

上一篇: python得到得到当前登录用户信息
下一篇: java RSA公钥加密,私钥解密算法例子.

Avatar

dazi 评论于: 2014-10-13

咨询下 我QQ  160497231
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号