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

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

转载地址:http://supanccy2013.iteye.com/blog/2101964


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


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


1,手写新建一个properties的配置文件,放在src的根目录下,内容如下: 
Java代码  收藏代码
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的接口。内容如下: 
Java代码  收藏代码
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 


Java代码  收藏代码
<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实现类 
Java代码  收藏代码
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,测试类 
Java代码  收藏代码
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,存储过程 
Java代码  收藏代码
/*创建存储过程,该存储过程三个参数,前两个是输出参数 
最后一个是输入参数*/  
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 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用Spring Security来实现用户密码加密。Spring Security提供了一个安全的基础框架,可以帮助您实现基于用户名和密码的身份验证。它还提供加密技术,以确保密码在传输过程不会被窃取。 ### 回答2: 在使用Spring Boot编写用户密码加密时,可以借助Spring Security提供的加密功能。以下是使用Spring Boot进行用户密码加密的简单步骤: 首先,需要在Spring Boot项目添加依赖项,目前较为常用的密码加密算法是BCrypt。可以在pom.xml文件添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 然后,创建一个实现了PasswordEncoder接口的加密器Bean。在这个实现类,可以使用Spring Security提供的BCryptPasswordEncoder来实现密码加密。代码示例如下: ```java import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } ``` 接下来,可以在用户注册或修密码的时候使用这个加密器进行密码加密操作了。例如,可以创建一个用户注册接口,通过在服务类调用密码编码器的encode方法来对密码进行加密。代码示例如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; @Autowired private PasswordEncoder passwordEncoder; public void registerUser(String username, String password) { String encodedPassword = passwordEncoder.encode(password); // 将用户名和加密后的密码保存到数据 } ``` 以上就是使用Spring Boot编写用户密码加密的基本步骤。通过引入Spring Security提供的密码加密器,可以轻松实现对用户密码的安全加密,提高系统的安全性。 ### 回答3: 使用Spring Boot编写用户密码加密的步骤如下: 1. 引入相关依赖:在Spring Boot项目的pom.xml文件加密加密相关的依赖,如Spring Security等。 2. 创建用户实体:定义一个User实体类,包含用户名和密码字段。 3. 创建密码加密工具类:创建一个PasswordEncryptionUtil工具类,用于对用户密码进行加密和验证。 4. 配置加密算法:在Spring Boot的配置文件配置密码加密算法的相关信息,如加密算法类型、密钥长度等。 5. 注册用户:在用户注册的接口,通过调用PasswordEncryptionUtil的加密方法对用户密码进行加密,然后将加密后的密码存储到数据。 6. 用户登录:在用户登录的接口,通过调用PasswordEncryptionUtil的验证方法,将用户输入的密码数据存储的加密后的密码进行比对,验证用户的账号和密码是否匹配。 7. 其他操作:在其他需要使用到用户密码的地方,都需要通过PasswordEncryptionUtil的加密和验证方法来处理用户密码。 通过以上步骤,就可以使用Spring Boot编写一个用户密码加密的功能。利用加密算法对用户密码进行加密后,可以增加用户密码的安全性,防止密码泄露和明文存储的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值