`
laoli5290
  • 浏览: 81406 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

使用Spring PropertyPlaceholderConfigurer加载的配置文件加密

阅读更多

为了使application.properties文件中的数据库连接用户名和密码保存成密文,我们做如下处理:首先使用加密程序算出密文,然后spring 加载配置文件的时候再解密,其实就是在数据库连接池调用之前进行了解密工作。

原配置文件如:

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl
jdbc.username=oracle
jdbc.password=oracle

 加密后的配置文件[生成此密文的秘钥和下面常量里面的秘钥不同]:

jdbc.driverClassName=eb04a2effc62b4119af9fc911259d3346835eff4edf1de6bbfd187f7a2c73828
jdbc.url=ecb893755ede111c849a884924d16f1ea3874f16546e457950d8a541d3b2aee1ce7bd2073ebd0e3f
jdbc.username=ff91f4d795574a71
jdbc.password=ff91f4d795574a71

 我使用的javax.crypto.Cipher加密解密类,根据项目使用不同可以随意更换自己的加密解密算法,之后添加PropertyPlaceholderConfigurer的子类,在processProperties方法中解密即可,代码如下:

import java.util.Properties;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import com.joinsoft.LoginConstants;

public class EncryptablePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{

	private static final String key = LoginConstants.JDBC_DESC_KEY;

    protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)
        throws BeansException {
            try {
            	EncryptionDecryption decryption = new EncryptionDecryption(key);
            	
                String username = props.getProperty(LoginConstants.JDBC_DATASOURCE_USERNAME_KEY);
                if (username != null) {
                    props.setProperty(LoginConstants.JDBC_DATASOURCE_USERNAME_KEY, decryption.decrypt(username));
                }
                
                String password = props.getProperty(LoginConstants.JDBC_DATASOURCE_PASSWORD_KEY);
                if (password != null) {
                    props.setProperty(LoginConstants.JDBC_DATASOURCE_PASSWORD_KEY, decryption.decrypt(password));
                }
                
                String url = props.getProperty(LoginConstants.JDBC_DATASOURCE_URL_KEY);
                if (url != null) {
                    props.setProperty(LoginConstants.JDBC_DATASOURCE_URL_KEY, decryption.decrypt(url));
                }
                
                String driverClassName = props.getProperty(LoginConstants.JDBC_DATASOURCE_DRIVERCLASSNAME_KEY);
                if(driverClassName != null){
                    props.setProperty(LoginConstants.JDBC_DATASOURCE_DRIVERCLASSNAME_KEY, decryption.decrypt(driverClassName));
                }
                super.processProperties(beanFactory, props);
            } catch (Exception e) {
                e.printStackTrace();
                throw new BeanInitializationException(e.getMessage());
            }
        }
}

 附1,加密解密程序:

import java.security.Key;
import java.security.Security;

import javax.crypto.Cipher;

import com.sun.crypto.provider.SunJCE;

public class EncryptionDecryption {
    private static String strDefaultKey = "goodluck";
    private Cipher encryptCipher = null;
    private Cipher decryptCipher = null;

    public static String byteArr2HexStr(byte[] arrB) throws Exception {
        int iLen = arrB.length;
        StringBuffer sb = new StringBuffer(iLen * 2);
        for (int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            while (intTmp < 0) {
                intTmp = intTmp + 256;
            }
            if (intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    public static byte[] hexStr2ByteArr(String strIn) throws Exception {
        byte[] arrB = strIn.getBytes();
        int iLen = arrB.length;

        byte[] arrOut = new byte[iLen / 2];
        for (int i = 0; i < iLen; i = i + 2) {
            String strTmp = new String(arrB, i, 2);
            arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
        }
        return arrOut;
    }

    public EncryptionDecryption() throws Exception {
        this(strDefaultKey);
    }

    public EncryptionDecryption(String strKey) throws Exception {
        Security.addProvider(new SunJCE());
        Key key = getKey(strKey.getBytes());

        encryptCipher = Cipher.getInstance("DES");
        encryptCipher.init(Cipher.ENCRYPT_MODE, key);

        decryptCipher = Cipher.getInstance("DES");
        decryptCipher.init(Cipher.DECRYPT_MODE, key);
    }

    public byte[] encrypt(byte[] arrB) throws Exception {
        return encryptCipher.doFinal(arrB);
    }

    public String encrypt(String strIn) throws Exception {
        return byteArr2HexStr(encrypt(strIn.getBytes()));
    }

    public byte[] decrypt(byte[] arrB) throws Exception {
        return decryptCipher.doFinal(arrB);
    }

    public String decrypt(String strIn) throws Exception {
        try {
            return new String(decrypt(hexStr2ByteArr(strIn)));
        } catch (Exception e) {
            return "";
        }
    }

    private Key getKey(byte[] arrBTmp) throws Exception {      
        byte[] arrB = new byte[8];
        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }
        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
        return key;
    }
       
}

 附2,常量定义:

//jdbc文件加密
public static final String JDBC_DESC_KEY = "missyou";
public static final String JDBC_DATASOURCE_USERNAME_KEY = "jdbc.username";
public static final String JDBC_DATASOURCE_PASSWORD_KEY = "jdbc.password";
public static final String JDBC_DATASOURCE_URL_KEY = "jdbc.url";
public static final String JDBC_DATASOURCE_DRIVERCLASSNAME_KEY = "jdbc.driverClassName";

 

1
0
分享到:
评论

相关推荐

    Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取

    以上就是关于"Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取"的详细解释,涵盖了Spring的配置处理、ZooKeeper的使用以及两者结合的实现过程。理解并掌握这一技术,有助于提升...

    Spring动态加载配置文件

    要实现动态加载配置文件,我们可以利用Spring的`PropertyPlaceholderConfigurer`或`@PropertySource`注解。`PropertyPlaceholderConfigurer`是Spring早期版本中处理属性文件的工具,而`@PropertySource`则是从Spring...

    Spring3.0 配置文件中加载Properties文件的小例子

    本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...

    Spring数据库连接等配置加密

    `propertyConfigurer`则告诉Spring使用解密器来处理配置文件中的加密属性。 最后,关于`junfeng`这个文件,它可能是作者在文章中提到的一种特定的加密方式或者一个工具的名称。由于没有具体的文件内容,这里无法给...

    Spring中PropertyPlaceholderConfigurer的使用

    使用 PropertyPlaceholderConfigurer 需要首先在 Spring 配置文件中定义一个 bean,例如: ```xml &lt;bean id="propertyConfigurerForAnalysis" class="org.springframework.beans.factory.config....

    Spring加载加密的配置文件详解

    接下来,我们需要在Spring的配置文件(如`applicationContext.xml`或`beans.xml`)中配置这个自定义的属性文件配置器,以便Spring在启动时使用它加载加密的配置文件: ```xml &lt;beans xmlns="http://www.spring...

    详解Spring加载Properties配置文件的四种方式

    在Spring XML配置文件中,可以使用PropertyPlaceholderConfigurer类来加载Properties配置文件。例如: ``` &lt;bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; &lt;value&gt;...

    spring mvc 读取配置文件

    这篇博客“spring mvc 读取配置文件”将深入探讨如何在Spring MVC中读取和使用配置文件,以及相关工具的应用。 首先,Spring MVC中的配置文件通常是指XML配置文件,如`applicationContext.xml`或`servlet-context....

    spring配置文件加密方法示例

    4. 在属性文件中,使用加密后的字符串保存敏感信息。 通过这种方法,我们可以确保即使配置文件被泄露,敏感信息也不会以明文形式暴露,从而提高了系统的安全性。同时,这也有助于遵循最佳实践,降低潜在的安全风险...

    Spring属性占位符PropertyPlaceholderConfigurer的使用

    在Spring框架中,属性占位符`PropertyPlaceholderConfigurer`是一个重要的工具,用于处理配置文件中的属性值引用。它使得我们可以在XML配置文件中使用占位符`${...}`来引用外部属性文件中的值,从而使应用配置更加...

    Spring如何使用PropertyPlaceholderConfigurer读取文件

    使用PropertyPlaceholderConfigurer可以解决一些问题,例如,每一次加载配置文件时,我们都需要手工读取配置文件,这样编码麻烦且代码不优雅。使用PropertyPlaceholderConfigurer可以将配置文件的路径放在java虚拟机...

    在Spring中使用加密外部属性文件

    Spring默认的`PropertyPlaceholderConfigurer`不直接支持加密的属性文件,但它提供了扩展点,允许我们自定义实现来处理加密后的属性。以下是一种实现方式: 1. 创建一个自定义的`PropertyPlaceholderConfigurer`...

    Spring配置加密方案收集.pdf

    在Spring配置中,我们可以使用`PropertyPlaceholderConfigurer`或`PropertiesFactoryBean`来加载加密后的属性文件,并在运行时调用`EncryptPropertyFile`类的解密方法,确保Spring在初始化时能够正确解析和加载加密...

    spring 配置文件 归类

    在Spring框架中,配置文件是核心组成部分,它们用于定义bean的定义、依赖关系以及各种配置信息。本篇文章将深入探讨Spring配置文件中的归类,主要包括IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented ...

    spring 启动时加载不同的文件

    ### Spring启动时根据配置文件加载不同文件的知识点详解 #### 一、背景介绍 在实际的应用开发中,根据运行环境的不同(例如开发环境、测试环境、生产环境等),应用程序往往需要连接不同的数据库或其他资源。为了...

    加载properties配置文件的几种方法

    另一种方式是直接使用`java.util.Properties`类的`load()`方法加载文件,然后通过`getProperty()`获取属性值: ```java Properties props = new Properties(); props.load(new FileInputStream("config....

    spring,配置文件从属性文件读取JDBC连接的相关参数

    这段配置告诉Spring在类路径下查找`jdbc.properties`并将其内容加载到`PropertyPlaceholderConfigurer` bean中。 3. **注入属性值**: 现在,我们可以在其他bean的定义中使用`@Value`注解来注入属性值。例如,...

    Spring的log4j以及配置文件

    在Spring框架中,我们可以使用Spring的`PropertyPlaceholderConfigurer`来读取`log4j.properties`文件中的配置,并动态注入到应用中。这允许我们在不重启应用的情况下,通过修改外部的配置文件来调整日志级别和输出...

    SPRING:bean配置properties

    `PropertyPlaceholderConfigurer`允许我们在Spring的配置文件中引用外部的properties文件,以实现配置信息的灵活管理和动态加载。以下是一个基本的配置示例: ```xml class="org.springframework.beans.factory....

    Spring项目application.xml配置文件加解密

    当Spring启动时,它会自动解密配置文件中的加密属性,从而保护了敏感信息的安全。这种方式可以有效地避免因配置文件泄露而导致的数据安全问题。同时,由于使用了对称加密算法,加解密过程相对高效,不会对应用性能...

Global site tag (gtag.js) - Google Analytics