spring读取加密配置信息

描述&背景
Spring框架配置数据库等连接等属性时,都是交由 PopertyPlaceholderConfigurer进行读取.properties文件的,但如果项目不允许在配置文件中明文保存密码等重要的连接信息,此时,唯有继承PopertyPlaceholderConfigurer,并重写convertProperty(String propertyName, String propertyValue)方法,该方法是java中少有的传参承载设计模式,在这里,我们可以拿到我们需要进行解密的密文再传给spring组件去连接数据库,避免了明文保存。所以我们可以将加密后的信息保存到.Properties文件中,在读取前解密,就可以实现不明文保存信息需求。这里我将用AES来加密重要信息。
步骤
1. 导加密工具文件
将AES加密文件放到项目工具类的位置,如有其它加密和解密工具,可不用我这个AES加密。
2. 继承PropertyPlaceholderConfigurer

package com.openeap.common.web;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import com.openeap.common.utils.aes.AESEncryptor;

public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{
    private String[] encryptPropNames = {"jdbc.username", "jdbc.password"};
    private String code = "gzxcxxxtgcyxgs01";
    @Override
    protected String convertProperty(String propertyName, String propertyValue)
    {
        //如果在加密属性名单中发现该属性
        if (isEncryptProp(propertyName))
        {
            String decryptValue="";
            try {
                decryptValue = AESEncryptor.decrypt(code, propertyValue);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
            System.out.println(decryptValue);
            return decryptValue==""?propertyValue:decryptValue;
        }else {
            return propertyValue;
        }  

    }  

    private boolean isEncryptProp(String propertyName)
    {
        for (String encryptName : encryptPropNames)
        {
            if (encryptName.equals(propertyName))
            {
                return true;
            }
        }
        return false;
    }
}

AES加密,还需要一个code,这里需要一个是16位或者16位配数的密钥当spring读取到带有encryptPropNames包含的字段时,会执行convertProperty方法进行解密
注:.propertites文件中保存的格式为
jdbc.username=admin
jdbc.password=123456

3. Spring配置文件配置
在spring加载属性配置文件时,用

<bean class="com.openeap.common.web.EncryptPropertyPlaceholderConfigurer"  >
         <property name="ignoreUnresolvablePlaceholders" value="true"></property>
        <property name="locations">
           <list>
               <value>classpath*:/application.properties</value>
           </list>
       </property>
    </bean>

替换原来的

<context:property-placeholder ignore-unresolvable="true" location="classpath*:/application.properties" />

4. 计算加密后的信息
AES加密方法中encrypt(String seek, String cleartext),例如原始值是aaa,密钥是1234567887654321,得到的密码是N!Kk8dwLm0z7hlGkq2dbdQ==

最后将密文信息回填到.properties文件中。

jdbc.username=N!Kk8dwLm0z7hlGkq2dbdQ==

至此,spring不在配置信息里保存重要的明文信息了。

如有错误,恳请指正,不胜感激!

===============我是分割线==============

AES加密文件下载地址

http://pan.baidu.com/s/1jH6bM3W

如失效请邮件通知我,[email protected]

时间: 2024-10-19 17:27:42

spring读取加密配置信息的相关文章

Spring读取加密属性文件处理

引言:Spring框架俨然已经是目前Java WEB项目开发的一个宠儿,更有人将Spring, Struts,和Hibernage称之为Java WEB项目开发的3件利器.Spring的依赖.注入.AOP及和其它框架的很好集成(如:hibername.ibatis.struts等)确实给web项目开发带来了诸多便利性,但是任何一种框架都不能完全满足个性化需求开发,spring亦是如此.现有一个项目是基于spring.struts和ibtatis的,其中数据库连接池使用的是proxool,领导要求

golang 读取 ini配置信息

package main //BY: [email protected]//这个有一定问题   如果配置信息里有中文就不行//[Server] ;MYSQL配置//Server=localhost   ;主机//golang 读取 ini配置信息//http://www.widuu.com/archives/02/961.htmlimport (  "fmt"  "github.com/widuu/goini"  //"runtime"  //&

Spring容器,Bean配置信息,Bean实现类以及应用程序四者的相互关系(看书随笔)

Spring容器,Bean配置信息,Bean实现类以及应用程序四者的相互关系图: Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载\实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序调用.

读取.properties配置信息

package com.ctcti.webcallcenter.utils; import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;

Spring MVC一些配置信息解析

springMVC框架请求响应步骤 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找Handler 可以根据xml配置.注解进行查找 第三步:处理器映射器HandlerMapping向前端控制器返回Handler 第四步:前端控制器调用处理器适配器(HandlerAdapter)去执行Handler 第五步:处理器适配器去处理Handler 第六步:Handler处理完给适配器返回ModelAndView 第七步:处理器适

读取config配置信息

//config.properties中配置了数据库配置的相关信息,通过这个单例模式设计来实现解耦. public class PathConfig { private static PathConfig instance = null; private String dataPath = null; private PathConfig(){ InputStream in = getClass().getResourceAsStream("/config.properties");

wdmWin10下读取PCI配置信息

WDM下HalGetBusData不能用了.加上感觉png方式太麻烦.自己修改了驱动开发技术详解上的代码直接在驱动下获取信息 #include "Driver.h" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { NTSTATUS status; //判断CPU类型 CPUType(); //枚举 EnumeratePCI(); KdPrint((&qu

spring读取properties配置

@Componentpublic class BaseConfigPath {private static final String configPath = System.getProperty("user.home")+"/code/config";public String getConfigPath() {return configPath;}} 根据配置文件路径解析properties <context:property-placeholder lo

教你如何利用分布式的思想处理集群的参数配置信息——spring的configurer妙用

引言 最近LZ的技术博文数量直线下降,实在是非常抱歉,之前LZ曾信誓旦旦的说一定要把<深入理解计算机系统>写完,现在看来,LZ似乎是在打自己脸了.尽管LZ内心一直没放弃,但从现状来看,需要等LZ的PM做的比较稳定,时间慢慢空闲出来的时候才有机会看了.短时间内,还是要以解决实际问题为主,而不是增加自己其它方面的实力. 因此,本着解决实际问题的目的,LZ就研究出一种解决当下问题的方案,可能文章的标题看起来挺牛B的,其实LZ就是简单的利用了一下分布式的思想,以及spring框架的特性,解决了当下的参