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

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

作者: 安易学车 | 来源:发表于2019-03-19 13:48 被阅读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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vypgmqtx.html