美文网首页
采用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配置文件敏感信息加密处理

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

  • 加密算法

    对称加密算法: 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption...

  • AES加密解密

    DES加密方式已证实可被破解,客户要求跟换,故采用AES加密

  • Java中的加密,[干货]

    1、对称加密算法,如:AES、DES、3DES对称秘钥加密,就是采用这种加密方法的双方使用方式用同样的密钥进行加密...

  • 密码学之—Hash&对称

    概述 1.对称加密:指加密和解密使用相同密钥的加密算法,它用来对敏感数据等信息进行加密。常用的包括(DES、3DE...

  • 密码学中的对称加密和非对称加密

    一、对称加密概念:加密和解密用同一对密钥的加密技术,叫对称加密。加密方式:DES、3DES、AES,安全性依次从低...

  • 对称加密与非对称加密

    一.对称加密 常用的对称加密DES、AES,DES也有衍生的3DES等加密方式 对称加密用到的加密模式有ECB、C...

  • iOS 加密:MD5、BASE64、(AES)对称加密、非对称加

    iOS在安全方面所采用的的加密方式:MD5、BASE64、(AES)对称加密、非对称加密、DES(keychain...

  • iOS安全之HASH加密

    HASH 现在在处理App的用户敏感信息方面,大部分都是采用HASH加密的方式来进行处理。 1、HASH的概念 H...

  • 哈希 HASH·数字签名

    HASH 现在在处理App的用户敏感信息方面,大部分都是采用HASH加密的方式来进行处理。 关于哈希算法 详细看这...

网友评论

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

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