`
Supanccy2013
  • 浏览: 214948 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

项目中关于配置文件中密码的加密处理

阅读更多
注:原创作品,转载请注明出处。


    在项目中,为了项目的配置灵活,长把一些常量写在配置文件中,这时涉及一个问题,就是如果配置字段是密码,就不够安全。这个时候需要在配置文件中把密码加密处理。下面是处理方案:
    实际遇到的有两种情况,一种是自己写程序来都去配置文件,这个时候处理比较简单,把自己的加密工具,把密码加个密放进配置文件中,读取的时候再解密即可。 第二种情况是遇到框架东西,例如spring这种框架,密码加密之后卸载配置文件中,我们该怎么处理:下面是处理方法:

    1,用自己的加密工具把密码加密之后的密文卸载spring配置文件中。
    2,自己写一个读取配置文件的类,这个类必须实现spring的一个接口,并实现当中的相关方法,把这个类配置到spring的配置文件中,并且配置的时候这个类的id必须是固定的,这样spring才能用你写的集成类读取配置文件。
    下面是实例:

1,手写新建一个properties的配置文件,放在src的根目录下,内容如下:
driverClass=oracle.jdbc.driver.OracleDriver
jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
user=supan
password=root
maxPoolSize=100
maxIdleTime=100
maxStatementsPerConnection=100
numHelperThreads=1000
idleConnectionTestPeriod=30


2,自己写一个读取配置文件的类,该类必须继承spring的接口。内容如下:
package com.supan.frame;
import java.util.Enumeration;
import java.util.Properties;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.util.ObjectUtils;
public class MyPropertyPlaceConfigurer extends PropertyPlaceholderConfigurer
{
	@Override
	protected void convertProperties(Properties props)
	{
		super.convertProperties(props);
		//读取properties文件中键的名字
		Enumeration<?> propertyNames = props.propertyNames();
		//遍历键名字
		while(propertyNames.hasMoreElements())
		{
			String propertyName = (String)propertyNames.nextElement();
			//配置的值
			String propertyValue = props.getProperty(propertyName);
			//转换后的值
			String convertedValue = convertPropertyValue(propertyValue);
			
			//对名为password的值进行解密
			if("password".equals(propertyName))
			{
				//在这里可以用自己的加密工具对配置的密文进行解密
				//因为此时没有加密工具只是演示一下。
//				convertedValue = EmfCipher.decrpypt(convertedValue);
				convertedValue = "root";
			}
			
			if(ObjectUtils.nullSafeEquals(propertyValue, convertedValue))
			{
				//注意:这里并不是去修改配置文件,而是改变读取到配置文件中的键值对
				props.setProperty(propertyName, convertedValue);
			}
		}
	}
}



3,把自己写的读取配置文件的java类配置到配置文件中。注意配置读取bean的id一定要是propertyConfigurer

<beans xmlns="http://www.springframework.org/schema/beans"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xmlns:tx="http://www.springframework.org/schema/tx"    
    xmlns:aop="http://www.springframework.org/schema/aop"    
    xmlns:context="http://www.springframework.org/schema/context"    
    xsi:schemaLocation="http://www.springframework.org/schema/aop       
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     
      http://www.springframework.org/schema/beans       
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
      http://www.springframework.org/schema/context     
      http://www.springframework.org/schema/context/spring-context-3.0.xsd     
      http://www.springframework.org/schema/tx       
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">   
    
    <!--注入配置文件读取bean -->
    <bean id="propertyConfigurer" class="com.supan.frame.MyPropertyPlaceConfigurer">
            <property name="locations">
              <list>
                <value>jdbc.properties</value>
              </list>
            </property>
    </bean>
    
    <!-- 定义数据源Bean,使用C3P0数据源实现 --> 
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
	  <property name="driverClass">
	   <value>${driverClass}</value>
	  </property>
	  <property name="jdbcUrl">
	   <value>${jdbcUrl}</value>
	  </property>
	  <property name="user">
	   <value>${user}</value>
	  </property>
	  <property name="password">
	   <value>${password}</value>
	  </property>
	  <property name="maxPoolSize">
	   <value>${maxPoolSize}</value>
	  </property>
	  <property name="maxIdleTime">
	   <value>${maxIdleTime}</value>
	  </property>
	  <property name="maxStatementsPerConnection">
	   <value>${maxStatementsPerConnection}</value>
	  </property>
	  <property name="numHelperThreads">
	   <value>${numHelperThreads}</value>
	  </property>
	  <property name="idleConnectionTestPeriod">
	   <value>${idleConnectionTestPeriod}</value>
	  </property>
	 </bean>
    <!-- 定义HIbernate的SessionFactory,让Spring管理HIbernate,实现Spring和hibernate的整合 -->    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="dataSource" ref="dataSource"></property>  
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>   
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>  
        </property>  
        <property name="mappingResources">  
            <list>  
               <value>com/supan/bean/User.hbm.xml</value>
            </list>  
        </property>  
    </bean> 
    
    <bean id="userDao" class="com.supan.dao.imp.UserDaoImp">
       <property name="sessionFactory" ref="sessionFactory"></property>
    </bean> 
</beans>


4,userDao实现类
public void getUserNameAndInfo()
	{
		//定义存放结果的结果map
		final Map<String,String> result = new HashMap<String, String>();
		getHibernateTemplate().execute(new HibernateCallback<Object>()
		{
			@Override
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException
			{
				session.doWork(new Work()
				{
					@Override
					public void execute(Connection conn) throws SQLException
					{
						CallableStatement proc = null;
						try
						{
							proc = conn.prepareCall("{call PROC_GETUSER_NAME_AGE(?,?,?)}");
							
							//注意:这里是注册输出参数
							proc.registerOutParameter(1, java.sql.Types.VARCHAR);
							proc.registerOutParameter(2, java.sql.Types.VARCHAR);
							//注意:这里是传递输入参数
							proc.setLong(3, 21L);
							
							//执行存储过程
							proc.execute();
							
							//获取执行完的存储过程的返回值
							result.put("name", proc.getString(1));
							result.put("age", proc.getString(2));
						}
						catch(Exception e)
						{
							//logger.error("访问数据库失败");
							e.printStackTrace();
							result.put("name", null);
							result.put("age", null);
						}
						finally
						{
							if(null != proc)
							{
								proc.close();
							}
						}
					}
				});
				
				return null;
			}
		});
		
		System.out.println(result.get("name"));
		System.out.println(result.get("age"));
	}


5,测试类
package com.supan.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.supan.dao.UserDao;
import junit.framework.TestCase;
public class JunitMainTest extends TestCase
{
     public void testApringAndHibernate()
     {
    	 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    	 UserDao ud = (UserDao)ctx.getBean("userDao");
    	 ud.getUserNameAndInfo();
     }
}


6,创建数据库表,并插入一条数据
-- Create table
create table TBL_USER
(
  ID     NUMBER(10) not null,
  NAME   VARCHAR2(20 CHAR),
  INFO   VARCHAR2(30 CHAR),
  REMARK VARCHAR2(30 CHAR),
  AGE    VARCHAR2(3 CHAR)
);
insert into tbl_user values(hibernate_sequence.nextval,'chenchaoyang','is a good man','hahha','26');

7,存储过程
/*创建存储过程,该存储过程三个参数,前两个是输出参数
最后一个是输入参数*/
create or replace procedure PROC_GETUSER_NAME_AGE(userName out varchar2,
                                                  userAge  out varchar2,
                                                  userId   in long) 
AS
  --声明该存储过程为“自治事物单元”
  PRAGMA AUTONOMOUS_TRANSACTION;
  
  --定义两个变量
  v_userName varchar2(255);
  v_userAge  varchar2(255);

begin
  select name, info into v_userName, v_userAge from TBL_User t where t.id = userId;
  userName := v_userName;
  userAge  := v_userAge;
end;



8,输出结果:
chenchaoyang
is a good man


   
分享到:
评论

相关推荐

    Spring Boot项目application.yml文件数据库配置密码加密

    在Spring boot开发中,需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于”裸奔”了,因此需要进行加密处理才行。  使用@SpringBoot...

    JASYPT实现项部部署配置文件加密

    项目部署时数据库连接信息,缓存连接信息等账号密码都在配置文件中为明文,为了安全期间,通过Jasypt进行加密处理

    laravel-envcoder:Laravel环境加密软件包

    将.env的加密版本提交到源代码管理中,以与团队共享编写用于各种自动部署过程(密码可以存储在本地,冲突解决) 可以配置为覆盖,合并或以交互方式决定如何处理.env中的合并冲突不需要对项目进行任何更改即可检索....

    private:Emacs 包来处理你的私有配置文件

    Private 通过使用您指定的密码加密私有配置文件来工作。 用法: 将每个私有配置放入一个私有配置目录,默认为“~/.emacs.d/private”。 并使 git 忽略此目录。 (private-require & optional package) 此功能需要您...

    CAS的客户端与服务器配置

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: 开源的企业级单点登录解决方案。 CAS Server 为需要...

    TrueCrypt的国内延伸版本CnCrypt V1.11(单一文件绿色版)

    便携版本配置文件目录移动到用户数据目录(之前为程序目录) 增加文件日期修改工具 增加加密卷占用磁盘空间压缩功能 CnCrypt V1.10 修改记录 增加加密卷空间扩充工具 恢复了TrueCrypt原有系统加密功能 修正了...

    rar压缩软件.rar

    如果在命令行或配置文件中指定开关 -ilog ,RAR 将会把处理压缩文件中遇到的错误 等写到日志文件中。读取开关 -ilog 描述获得更多信息。 固实压缩的文件列表 - rarfiles.lst ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

    JAVA毕业设计之springboot046古典舞在线交流平台的设计与实现(springboot+mysql)完整源码.zip

    配置文件:包含项目的配置文件,如数据库连接信息、Spring Boot配置等。通过这个项目,你可以学习到如何使用Spring Boot和MySQL搭建一个完整的Web应用,同时也可以了解到如何设计和实现一个在线交流平台。

    springboot+mybatis等测试项目

    通过配置文件连接数据库,并且使用jasypt对数据登录名密码进行加密处理,数据分页等

    中文简体压缩软件RAR 6.0

    如果在命令行或配置文件中指定开关 -ilog ,RAR 将会把处理压缩文件中遇到的错误 等写到日志文件中。在 Unix 中,这个文件名为 .rarlong,放在用户的 home 目录中。 在 Windows 中,它名为 rar.log,放在 rar....

    WINRAR5.0正式注册版

    RAR 5.0 压缩文件格式中恢复卷处理的更改: a) RAR 5.0 中最大 RAR+REV 卷数是65535,取代 255; b) 恢复卷的操作速度比 RAR 4.x 快; c) 除了恢复数据,RAR 5.0 REV 文件也存储了类似于文件校验和的服务信息来...

    asp.net 北极星博客

    asp.net里使用三层开发、水印,web.config文件配置 ,密码加密(SHA1),验证码,ajax控件的使用,里面使用的多种常用的控件等等 自己花了很长时间制做成功的!现在做毕业设计项目,没有时间再做更新升级了~~登录密码...

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

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    容灾项目从入门到实战视频.rar

    容灾项目搭建-配置文件.mp4 │ 10-vue入门-过滤器和缩写-1.mp4 │ 100-菜单页面组件的制作-1.mp4 │ 101-jsbug调试-1.mp4 │ 102-系统日志的基本功能整合-1.mp4 │ 103-自定义注解-1.mp4 │ 104-在切面中获取自定义...

    WinRAR_4.0.exe

    如果在命令行或配置文件中指定开关 -ilog ,RAR 将会把处理压缩文件中遇到的错误 等写到日志文件中。读取开关 -ilog 描述获得更多信息。 固实压缩的文件列表 - rarfiles.lst rarfiles.lst 包含一个用户定义...

    python项目基于lsb算法与rsa算法的信息隐藏算法实现(django).zip

    1. **系统设计**:项目主要目的是通过LSB(最低有效位)算法和RSA加密算法,将秘密信息嵌入到图像或音频等媒体文件中,以实现信息隐藏和保护。 2. **技术实现**: - 使用了Django框架,这是一个高级的Python Web...

    PHP-Employee-Management:一个雇员管理器,它使您可以查看来自同一平台的所有信息并进行编辑。 最终目的是能够通过json文件管理员工的CRUD,处理加密的密码以及从服务器与外部Web服务连接以获取员工的头像

    最终目的是能够通过json文件管理员工的CRUD,处理加密的密码以及从服务器与外部Web服务连接以便获得员工的头像。PHP基本应用程序来管理员工列表应用要点使用json文件登录和注销作为用户存储受控用户会话设置为10...

    springCloud.rar(私聊博主要密码)

    + springBoot + springCloud + 日志组件logback-spring + 多配置 + 多数据源...+ 传参注解式校验 + session练习 + 公用日志设计封装 + db乐观锁设计 + 优雅启停 + 配置文件信息加密 + AES加解密 + spring 事件监听设计

    ASP.NET.4揭秘 卷2

    n513 在Web配置文件中设置文化 n514 文化和ASPNET控件 n52 使用CultureInfo类 n521 使用CultureInfo类格式化字符串值 n522 比较和排序字符串值 n53 创建本地资源 n531 显式本地化表达式 n532 隐式本地化表达式 n533 ...

Global site tag (gtag.js) - Google Analytics