采用DES加密方式对properties配置文件敏感信息加密处理

2019-03-19  本文已影响0人  安易学车

由于项目的需要,要求对配置文件中的敏感信息进行加密处理,例如数据库用户名密码之类的

处理方式如下:

MyWebConstant

/**

* 对外接口,管理公共常量

* 对应properties中的key值

* @author Administrator

*

*/

public class MyWebConstant {

    public static final String JDBC_DATASOURCE_DRIVERCLASSNAME_KEY = "jdbc.driverClassName";

    public static final String JDBC_DATASOURCE_URL_KEY = "jdbc.url";

    public static final String JDBC_DATASOURCE_USERNAME_KEY = "jdbc.username";

    public static final String JDBC_DATASOURCE_PASSWORD_KEY = "jdbc.password";

}

EncryptablePropertyPlaceholderConfigurer.java

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;

/**

* 配置文件解密核心类

* 作为自定义类加到配置文件中,解密使用

* @author Administrator

*

*/

public class EncryptablePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)

throws BeansException {

try {

// DesEncrypt des = new DesEncrypt();

String username = props.getProperty(MyWebConstant.JDBC_DATASOURCE_USERNAME_KEY);

if (username != null) {

props.setProperty(MyWebConstant.JDBC_DATASOURCE_USERNAME_KEY,

DesEncrypt.decrypt(username, DesEncrypt.PASSWORD_CRYPT_KEY));

}

String password = props.getProperty(MyWebConstant.JDBC_DATASOURCE_PASSWORD_KEY);

if (password != null) {

props.setProperty(MyWebConstant.JDBC_DATASOURCE_PASSWORD_KEY,

DesEncrypt.decrypt(password, DesEncrypt.PASSWORD_CRYPT_KEY));

}

String url = props.getProperty(MyWebConstant.JDBC_DATASOURCE_URL_KEY);

if (url != null) {

props.setProperty(MyWebConstant.JDBC_DATASOURCE_URL_KEY,

DesEncrypt.decrypt(url, DesEncrypt.PASSWORD_CRYPT_KEY));

}

String driverClassName = props.getProperty(MyWebConstant.JDBC_DATASOURCE_DRIVERCLASSNAME_KEY);

if (driverClassName != null) {

props.setProperty(MyWebConstant.JDBC_DATASOURCE_DRIVERCLASSNAME_KEY,

DesEncrypt.decrypt(driverClassName, DesEncrypt.PASSWORD_CRYPT_KEY));

}

super.processProperties(beanFactory, props);

} catch (Exception e) {

e.printStackTrace();

throw new BeanInitializationException(e.getMessage());

}

}

}

DesEncrypt.java

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

/**

* 加密解密核心类

* @author Administrator

*

*/

public class DesEncrypt {

    /** 加密、解密key. */ 

    public static final String PASSWORD_CRYPT_KEY = "kEHrDooxWHCWtfeSxvDvgqZq";

    /** 加密算法,可用 DES,DESede,Blowfish. */ 

    private final static String ALGORITHM = "DES"; 

    /** 工具,用于加密字符串

    * @throws Exception */

    public static void main(String[] args) throws Exception { 

        String md5Password = "jdbc:oracle:thin:@localhost:1521:orcl"; 

        String str = DesEncrypt.encrypt(md5Password); 

        System.out.println("加密str: " + str); 

        str = DesEncrypt.decrypt(str,PASSWORD_CRYPT_KEY); 

        System.out.println("解密str: " + str); 

    }

    /**

    * 对用DES加密过的数据进行解密.

    * @param data DES加密数据

    * @return 返回解密后的数据

    * @throws Exception

    */ 

    public final static String decrypt(String data,String key) throws Exception { 

        return new String(decrypt(hex2byte(data.getBytes()),key.getBytes())); 

    }

    /**

    * 对数据进行DES加密.

    * @param data 待进行DES加密的数据

    * @param key DES加密的key

    * @return 返回经过DES加密后的数据

    * @throws Exception

    */ 

    public final static String encrypt(String data) throws Exception  { 

        return byte2hex(encrypt(data.getBytes(), PASSWORD_CRYPT_KEY.getBytes())); 

    }

    /**

    * 加密.

    */ 

    private static byte[] encrypt(byte[] data, byte[] key) throws Exception { 

        // DES算法要求有一个可信任的随机数源 

        SecureRandom sr = new SecureRandom(); 

        // 从原始密匙数据创建DESKeySpec对象 

        DESKeySpec dks = new DESKeySpec(key); 

        // 创建一个密匙工厂,然后用它把DESKeySpec转换成 

        // 一个SecretKey对象 

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); 

        SecretKey securekey = keyFactory.generateSecret(dks); 

        // Cipher对象实际完成加密操作 

        Cipher cipher = Cipher.getInstance(ALGORITHM); 

        // 用密匙初始化Cipher对象 

        cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); 

        // 现在,获取数据并加密 

        // 正式执行加密操作 

        return cipher.doFinal(data); 

    } 

    /**

    * 解密.

    */ 

    private static byte[] decrypt(byte[] data, byte[] key) throws Exception { 

        // DES算法要求有一个可信任的随机数源 

        SecureRandom sr = new SecureRandom(); 

        // 从原始密匙数据创建一个DESKeySpec对象 

        DESKeySpec dks = new DESKeySpec(key); 

        // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 

        // 一个SecretKey对象 

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); 

        SecretKey securekey = keyFactory.generateSecret(dks); 

        // Cipher对象实际完成解密操作 

        Cipher cipher = Cipher.getInstance(ALGORITHM); 

        // 用密匙初始化Cipher对象 

        cipher.init(Cipher.DECRYPT_MODE, securekey, sr); 

        // 现在,获取数据并解密 

        // 正式执行解密操作 

        return cipher.doFinal(data); 

    } 

    public static byte[] hex2byte(byte[] b) { 

        if ((b.length % 2) != 0) 

            throw new IllegalArgumentException("长度不是偶数"); 

        byte[] b2 = new byte[b.length / 2]; 

        for (int n = 0; n < b.length; n += 2) { 

            String item = new String(b, n, 2); 

            b2[n / 2] = (byte) Integer.parseInt(item, 16); 

        } 

        return b2; 

    } 

    public static String byte2hex(byte[] b) { 

        String hs = ""; 

        String stmp = ""; 

        for (int n = 0; n < b.length; n++) { 

            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); 

            if (stmp.length() == 1) 

                hs = hs + "0" + stmp; 

            else 

                hs = hs + stmp; 

        } 

        return hs.toUpperCase(); 

    } 

}

使用方式:

applicationContext.xml

<!-- 配置文件加密 -->

<bean id="propertyConfigurer" class="**.util.EncryptablePropertyPlaceholderConfigurer"> 

            <property name="locations">

                <list>

                    <value>classpath:jdbc.properties</value>

                </list>

            </property>

      </bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"

        destroy-method="close" >

        <property name="driverClass">

            <value>${jdbc.driverClassName}</value>

        </property>

        <property name="jdbcUrl">

            <value>${jdbc.url}</value>

        </property>

        <property name="user">

            <value>${jdbc.username}</value>

        </property>

        <property name="password">

            <value>${jdbc.password}</value>

        </property>

</bean>

则配置文件内容如下

jdbc.properties

databaseType=oracle

jdbc.driverClassName=EEA5BC6768D58CD1D4FD13AFAB68FF8C0175E46D44CF8CB3D8201139F32A6A31

#localhost

#jdbc.url=96B8431EF61A243F563E61B9FB74AB72D3C70E0FE22E09447234A79C0B4BE729C6FC1ABA62E71130

#172.0.0.1

jdbc.url=96B8431EF61A243F563E61B9FB74AB726464B1BB2C5D174A9514EEE48015A87BC6FC1ABA62E71130

jdbc.username=24DDF3AB7770F8A7

jdbc.password=9E81A937B272BB92F3C11AB9447D7D3D

---------------------

作者:烧开水大侠

来源:CSDN

原文:https://blog.csdn.net/lw9324/article/details/70741614

版权声明:本文为博主原创文章,转载请附上博文链接!

上一篇 下一篇

猜你喜欢

热点阅读