欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring*.xml配置文件明文加密的實(shí)現(xiàn)

 更新時(shí)間:2021年01月10日 11:18:45   作者:昊狼  
這篇文章主要介紹了spring*.xml配置文件明文加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

說明:客戶要求spring*.xml中Oracle/Redis/MongoDB的IP、端口、用戶名、密碼不能明文存放,接到需求的我,很無奈,但是還是的硬著頭皮搞

系統(tǒng)架構(gòu):spring+mvc(Oracle是用jdbc自己封裝的接口)

1.數(shù)據(jù)庫配置文件加密

原xml配置

<?xml version="1.0" encoding="utf-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
 default-autowire="byType">
  
<context:component-scan base-package="cn.geoff" use-default-filters="false">
 <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
 </context:component-scan>

 <!-- Database Connection Pool -->
 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
 <property name="url" value="jdbc:oracle:thin:@192.168.100.100:1521:orcl"/>
 <property name="username" value="Geoff"/>
 <property name="password" value="123456"/>
 <property name="validationQuery" value="select 'x' from dual"/>

 .....
 </bean>

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
 </bean>
  
  </beans>

加密實(shí)現(xiàn)過程

思路:繼承DruidDataSource,在初始化set值的時(shí)候進(jìn)行解密

/**
 * 數(shù)據(jù)庫連接解密
 * @author: Geoff
 * @create: 2020-12-30 16:46
 **/
public class DataBaseXml extends DruidDataSource {


  /**
   * Log4j logger
   */
  private final static Logger lg = LoggerFactory.getLogger(DataBaseXml.class);

  @Override
  public String getUrl() {
    return this.jdbcUrl;
  }

  @Override
  public void setUrl(String jdbcUrl) {
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("數(shù)據(jù)庫【jdbcUrl】解密初始化加載...");
      try {
        jdbcUrl = Encryption.decrypt(jdbcUrl, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("數(shù)據(jù)庫【jdbcUrl】密文解密失敗...");
        e.printStackTrace();
      }
    }
    this.jdbcUrl = jdbcUrl;
  }

  @Override
  public String getUsername() {
    return this.username;
  }

  @Override
  public void setUsername(String username) {
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("數(shù)據(jù)庫【username】解密初始化加載...");
      try {
        username = Encryption.decrypt(username, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("數(shù)據(jù)庫【username】密文解密失敗...");
        e.printStackTrace();
      }
    }
    this.username = username;
  }

  @Override
  public String getPassword() {
    return this.password;
  }

  @Override
  public void setPassword(String password) {
    if(GEOFF.DATA_BASE_IS_ENCRYPTION){
      lg.info("數(shù)據(jù)庫【password】解密初始化加載...");
      try {
        password = Encryption.decrypt(password, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("數(shù)據(jù)庫【password】密文解密失敗...");
        e.printStackTrace();
      }
    }
    this.password = password;
  }



}

修改后配置文件

<?xml version="1.0" encoding="utf-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
 default-autowire="byType">
  
<context:component-scan base-package="cn.GEOFF" use-default-filters="false">
 <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
 </context:component-scan>

 <bean id="dataSource" class="cn.GEOFF.framework.core.DataBaseXml" init-method="init" destroy-method="close">
 <property name="url" value="4lZ4l804zIDqOJ5Wt3VNVLZvSLSDqCuQwhg5cAbQ1VG/vx+x+pEJQ6VJmLPO+PKK"/>
 <property name="username" value="PFEz8V4uvb06KhQxCLvLNA=="/>
 <property name="password" value="mMckYd6C5fo="/>
 <property name="validationQuery" value="select 'x' from dual"/>

 
 .....
 </bean>

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
 </bean>
  
  </beans>

2.Redis配置文件加密

原配置文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<!-- Jedis -->
<beans default-autowire="byName">

 <!-- Default Pool Config -->
 <bean id="defaultJedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
 <property name="maxTotal" value="5"/>
 <property name="maxIdle" value="2"/>
 <property name="minIdle" value="2"/>
 <property name="testOnBorrow" value="true"/>
 <property name="testOnReturn" value="true"/>
 <property name="testWhileIdle" value="true"/>
 </bean>


 <bean id="one" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
    <constructor-arg index="0" ref="defaultJedisPoolConfig"/>
    <constructor-arg index="1" value="127.0.0.1" type="java.lang.String"/>
    <constructor-arg index="2" value="6379" type="int"/>
    <constructor-arg index="3" value="0" type="int"/>
    <constructor-arg index="4" value="123456" type="java.lang.String"/>
 </bean>


 <bean id="two" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
    <constructor-arg index="0" ref="defaultJedisPoolConfig"/>
    <constructor-arg index="1" value="127.0.0.1" type="java.lang.String"/>
    <constructor-arg index="2" value="6379" type="int"/>
    <constructor-arg index="3" value="0" type="int"/>
    <constructor-arg index="4" value="123456" type="java.lang.String"/>
 </bean>


 <bean id="three" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
    <constructor-arg index="0" ref="defaultJedisPoolConfig"/>
    <constructor-arg index="1" value="127.0.0.1" type="java.lang.String"/>
    <constructor-arg index="2" value="6379" type="int"/>
    <constructor-arg index="3" value="0" type="int"/>
    <constructor-arg index="4" value="123456" type="java.lang.String"/>
 </bean>
</beans>

加密實(shí)現(xiàn)思路:由于JedisPool使用構(gòu)造函數(shù)來創(chuàng)建,所以繼承JedisPool后,在調(diào)用JedisPool構(gòu)造函數(shù)的時(shí)候,調(diào)用static解密方法進(jìn)行解密

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.*;

/**
 * redis數(shù)據(jù)庫用戶名密碼解密
 * @author: Geoff
 * @create: 2020-12-30 17:20
 **/
public class JedisPoolXml extends JedisPool{


  /**
   * Log4j logger
   */
  private final static Logger lg = LoggerFactory.getLogger(JedisPoolXml.class);



  public JedisPoolXml(GenericObjectPoolConfig poolConfig, String host, String port, String timeout, String password) {
    super(poolConfig,decryptHost(host),decryptPort(port),decryptTimeout(timeout),decryptPassword(password), 0, (String)null);
  }

  private JedisPoolXml(GenericObjectPoolConfig poolConfig, String host, String port,String timeout, String password, String database){
    super(poolConfig,decryptHost(host),decryptPort(port),decryptTimeout(timeout),decryptPassword(password),decryptDatabase(database));
  }


  private static String decryptHost(String host){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("Redis【host】解密初始化加載...");
      try {
        host = Encryption.decrypt(host, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("Redis【host】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return host;
  }

  private static int decryptPort(String port){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("Redis【port】解密初始化加載...");
      try {
        port = Encryption.decrypt(port, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("Redis【port】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return Integer.parseInt(port);
  }

  private static int decryptTimeout(String timeout){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("Redis【timeout】解密初始化加載...");
      try {
        timeout = Encryption.decrypt(timeout, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("Redis【timeout】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return Integer.parseInt(timeout);
  }

  private static String decryptPassword(String password){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("Redis【password】解密初始化加載...");
      try {
        password = Encryption.decrypt(password, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("Redis【password】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return password;
  }

  private static int decryptDatabase(String database){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("Redis【database】解密初始化加載...");
      try {
        database = Encryption.decrypt(database, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("Redis【database】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return Integer.parseInt(database);
  }

}

修改后xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<!-- Jedis -->
<beans default-autowire="byName">

 <bean id="defaultJedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
 <property name="maxTotal" value="5"/>
 <property name="maxIdle" value="2"/>
 <property name="minIdle" value="2"/>
 <property name="testOnBorrow" value="true"/>
 <property name="testOnReturn" value="true"/>
 <property name="testWhileIdle" value="true"/>
 </bean>


 <bean id="one" class="cn.GEOFF.framework.core.JedisPoolXml" destroy-method="destroy">
 <constructor-arg index="0" ref="defaultJedisPoolConfig"/>
 <constructor-arg index="1" value="N98/M6A3acRnYMqIQEXGEg==" type="java.lang.String"/>
 <constructor-arg index="2" value="INDccYoGS/Y=" type="java.lang.String"/>
 <constructor-arg index="3" value="CXszBZysXWY=" type="java.lang.String"/>
 <constructor-arg index="4" value="mMckYd6C5fo=" type="java.lang.String"/>
 </bean>


 <bean id="two" class="cn.GEOFF.framework.core.JedisPoolXml" destroy-method="destroy">
 <constructor-arg index="0" ref="defaultJedisPoolConfig"/>
 <constructor-arg index="1" value="N98/M6A3acRnYMqIQEXGEg==" type="java.lang.String"/>
 <constructor-arg index="2" value="INDccYoGS/Y=" type="java.lang.String"/>
 <constructor-arg index="3" value="CXszBZysXWY=" type="java.lang.String"/>
 <constructor-arg index="4" value="mMckYd6C5fo=" type="java.lang.String"/>
 </bean>


 <bean id="three" class="cn.GEOFF.framework.core.JedisPoolXml" destroy-method="destroy">
 <constructor-arg index="0" ref="defaultJedisPoolConfig"/>
 <constructor-arg index="1" value="N98/M6A3acRnYMqIQEXGEg==" type="java.lang.String"/>
 <constructor-arg index="2" value="INDccYoGS/Y=" type="java.lang.String"/>
 <constructor-arg index="3" value="CXszBZysXWY=" type="java.lang.String"/>
 <constructor-arg index="4" value="mMckYd6C5fo=" type="java.lang.String"/>
 </bean>

</beans>

3.MongoDB配置文件加密(使用的是spring-data-mognodb框架)

原xml配置

<?xml version="1.0" encoding="utf-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:mongo="http://www.springframework.org/schema/data/mongo"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">


 <mongo:mongo-client id="mongoClient" host="192.168.100.100" port="27017" credentials="jyzq_zsc:123456@JYZQ_ZSC">
 
 </mongo:mongo-client>

 <!-- Factory -->
 <mongo:db-factory id="mongoDbFactory" dbname="PFEz8V4uvb06KhQxCLvLNA==" mongo-ref="mongoClient"/>
 <mongo:db-factory id="mongoDbFactory" dbname="JYZQ_ZSC" mongo-ref="mongoClient"/>
 <mongo:mapping-converter id="converter" db-factory-ref="mongoDbFactory"/>


 <!-- Grid FS Template -->
 <bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
 <constructor-arg ref="mongoDbFactory"/>
 <constructor-arg ref="converter"/>
 </bean>


 <!-- Mongo Template -->
 <bean id="documentTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
 <constructor-arg ref="mongoDbFactory"/>
 <constructor-arg ref="converter"/>
 </bean>

</beans>

加密思路:由于項(xiàng)目使用的時(shí)候是獲取bean的方式來獲取MongoTemplate和mongoDbFactory的,嘗試過各種方法來繼承后加密,但是最后都不行,后面只能通過手動(dòng)的方法進(jìn)行初始化,并將對應(yīng)MongoTemplate和mongoDbFactory注入到bean中

import com.mongodb.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: Geoff
 * @create: 2020-12-31 16:15
 **/

@Configuration
public class MongoDBXml {

  /**
   * Log4j logger
   */
  private final static Logger lg = LoggerFactory.getLogger(MongoDBXml.class);

  private String host;
  private Integer port;
  private String userName;
  private String passWord;
  private String dataBase;

  private SimpleMongoDbFactory mongoDbFactory = null;
  private MappingMongoConverter converter = null;


  public String getHost() {
    return host;
  }


  public void setHost(String host) {
    this.host = decryptHost(host);
  }

  public Integer getPort() {
    return port;
  }


  public void setPort(String port) {
    this.port = decryptPort(port);
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = decryptUserName(userName);
  }

  public String getPassWord() {
    return passWord;
  }

  public void setPassWord(String passWord) {
    this.passWord = decryptPassword(passWord);
  }

  public String getDataBase() {
    return dataBase;
  }

  public void setDataBase(String dataBase) {
    this.dataBase = decryptDatabase(dataBase);
  }

  private String decryptHost(String host){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("MongoDB【host】解密初始化加載...");
      try {
        host = Encryption.decrypt(host, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("MongoDB【host】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return host;
  }

  private int decryptPort(String port){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("MongoDB【port】解密初始化加載...");
      try {
        port = Encryption.decrypt(port, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("MongoDB【port】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return Integer.parseInt(port);
  }

  private String decryptUserName(String userName){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("MongoDB【userName】解密初始化加載...");
      try {
        userName = Encryption.decrypt(userName, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("MongoDB【userName】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return userName;
  }

  private String decryptPassword(String passWord){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("MongoDB【password】解密初始化加載...");
      try {
        passWord = Encryption.decrypt(passWord, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("MongoDB【password】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return passWord;
  }

  private String decryptDatabase(String dataBase){
    if(GEOFF.DATA_BASE_IS_ENCRYPTION) {
      lg.info("MongoDB【database】解密初始化加載...");
      try {
        dataBase = Encryption.decrypt(dataBase, GEOFF.DATA_BASE_ENCRYPTION_KEY);
      } catch (Exception e) {
        lg.error("MongoDB【database】密文解密失敗...");
        e.printStackTrace();
      }
    }
    return dataBase;
  }




  public void init() {
    MongoClientOptions.Builder build = new MongoClientOptions.Builder();
    MongoClientOptions options = build.build();
    try {
      List<ServerAddress> addrs = new ArrayList<ServerAddress>();
      ServerAddress serverAddress = new ServerAddress(host, port);
      addrs.add(serverAddress);
      MongoCredential credential = MongoCredential.createScramSha1Credential(userName, dataBase, passWord.toCharArray());
      List<MongoCredential> credentials = new ArrayList<MongoCredential>();
      credentials.add(credential);
      MongoClient mongoClient = new MongoClient(addrs, credentials, options);
      mongoDbFactory = new SimpleMongoDbFactory(mongoClient, dataBase);
      DefaultDbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
      MongoMappingContext mongoMappingContext = new MongoMappingContext();
      converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
      lg.info(" mongodb客戶端創(chuàng)建成功 ");
    } catch (Exception e) {
      lg.info(" mongodb客戶端創(chuàng)建失敗 ");
      e.printStackTrace();
    }
    documentTemplate();
    gridFsTemplate();


  }

  @Bean
  public MongoTemplate documentTemplate() {
    if (mongoDbFactory != null && converter != null) {
      lg.info("MongoTemplate初始化成功......");
      MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
      return mongoTemplate;
    } else {
      lg.error("MongoTemplate初始化失敗......");
      return null;
    }
  }

  @Bean
  public GridFsTemplate gridFsTemplate() {
    if (mongoDbFactory != null && converter != null) {
      lg.info("GridFsTemplate初始化成功......");
      GridFsTemplate gridFsTemplate = new GridFsTemplate(mongoDbFactory, converter);
      return gridFsTemplate;
    } else {
      lg.error("GridFsTemplate初始化失敗......");
      return null;
    }
  }

  public void destroy(){
    try {
      this.mongoDbFactory.destroy();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }


}

修改后配置文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<!-- mongoDB -->
<beans>

 <bean id="mongoDBXml" class="cn.GEOFF.framework.core.MongoDBXml" init-method="init" destroy-method="destroy" >
 <property name="host" value="PpmNMR+X2UIVhG8gmNFFqg=="/>
 <property name="port" value="51QH8fifl1k="/>
 <property name="userName" value="yre5DufK9os6KhQxCLvLNA=="/>
 <property name="passWord" value="mMckYd6C5fo="/>
 <property name="dataBase" value="PFEz8V4uvb06KhQxCLvLNA=="/>
 </bean>

</beans>

4.最后附上對應(yīng)的加解密類

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;
import java.security.SecureRandom;

/**
 * 加密生成token的方法
 *
 * @author: Geoff
 * @create: 2020-12-30 17:03
 **/

public class Encryption {
  // 算法名稱
  public static final String KEY_ALGORITHM = "DES";
  // 算法名稱/加密模式/填充方式
  // DES共有四種工作模式-->>ECB:電子密碼本模式、CBC:加密分組鏈接模式、CFB:加密反饋模式、OFB:輸出反饋模式
  public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";

  /**
   * 生成密鑰key對象
   *
   * @param
   * @return 密鑰對象
   * @throws Exception
   */
  private static SecretKey keyGenerator(String keyStr) throws Exception {
    byte[] input = HexString2Bytes(keyStr);
    DESKeySpec desKey = new DESKeySpec(input);
    // 創(chuàng)建一個(gè)密匙工廠,然后用它把DESKeySpec轉(zhuǎn)換成
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
    SecretKey securekey = keyFactory.generateSecret(desKey);
    return securekey;
  }


  /**
   * 從十六進(jìn)制字符串到字節(jié)數(shù)組轉(zhuǎn)換
   */
  public static byte[] HexString2Bytes(String hexStr) {
    byte[] keyBytes = hexStr.getBytes();
    if (keyBytes.length == 16) {
      byte[] tmpKey = new byte[24];
      System.arraycopy(keyBytes, 0, tmpKey, 0, 16);
      System.arraycopy(keyBytes, 0, tmpKey, 16, 8);
      keyBytes = tmpKey;
    }
    return keyBytes;
  }

  /**
   * 加密數(shù)據(jù)
   *
   * @param data 待加密數(shù)據(jù)
   * @param key 密鑰
   * @return 加密后的數(shù)據(jù)
   */
  public static String encrypt(String data, String key) throws Exception {
    Key deskey = keyGenerator(key);
    // 實(shí)例化Cipher對象,它用于完成實(shí)際的加密操作
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    SecureRandom random = new SecureRandom();
    // 初始化Cipher對象,設(shè)置為加密模式
    cipher.init(Cipher.ENCRYPT_MODE, deskey, random);
    byte[] results = cipher.doFinal(data.getBytes());
    // 執(zhí)行加密操作。加密后的結(jié)果通常都會(huì)用Base64編碼進(jìn)行傳輸
    return Base64.encodeBase64String(results);
  }

  /**
   * 解密數(shù)據(jù)
   *
   * @param data 待解密數(shù)據(jù)
   * @param key 密鑰
   * @return 解密后的數(shù)據(jù)
   */
  public static String decrypt(String data, String key) throws Exception {
    Key deskey = keyGenerator(key);
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    // 初始化Cipher對象,設(shè)置為解密模式
    cipher.init(Cipher.DECRYPT_MODE, deskey);
    // 執(zhí)行解密操作
    return new String(cipher.doFinal(Base64.decodeBase64(data)));
  }

}

到此這篇關(guān)于spring*.xml配置文件明文加密的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)spring*.xml配置文件加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)文件復(fù)制上傳操作

    java實(shí)現(xiàn)文件復(fù)制上傳操作

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件復(fù)制上傳操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析二之前端調(diào)用后端

    Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析二之前端調(diào)用后端

    我們講到了后端純Java Code的Dwr3配置,完全去掉了dwr.xml配置文件,但是對于使用注解的類卻沒有使用包掃描,而是在Servlet初始化參數(shù)的classes里面加入了我們的Service組件的聲明暴露,對于這個(gè)問題需要后面我們再細(xì)細(xì)研究下這篇文章,主要分析介紹前端怎么直接調(diào)用后端
    2016-04-04
  • spring+srpingmvc+hibernate實(shí)現(xiàn)動(dòng)態(tài)ztree生成樹狀圖效果

    spring+srpingmvc+hibernate實(shí)現(xiàn)動(dòng)態(tài)ztree生成樹狀圖效果

    這篇文章主要介紹了spring+srpingmvc+hibernate動(dòng)態(tài)ztree生成樹狀圖效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • IDEA中如何移除未使用的包

    IDEA中如何移除未使用的包

    這篇文章主要介紹了IDEA中如何移除未使用的包問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • JAVA后臺(tái)轉(zhuǎn)換成樹結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法

    JAVA后臺(tái)轉(zhuǎn)換成樹結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法

    這篇文章主要介紹了JAVA后臺(tái)轉(zhuǎn)換成樹結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java實(shí)現(xiàn)對稱加密DES和AES的示例代碼

    Java實(shí)現(xiàn)對稱加密DES和AES的示例代碼

    這篇文章主要介紹了如何使用Java實(shí)現(xiàn)采用對稱密碼算法的應(yīng)用軟件,所用算法包括DES算法和AES算法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04
  • java網(wǎng)上圖書商城(5)購物車模塊2

    java網(wǎng)上圖書商城(5)購物車模塊2

    這篇文章主要為大家詳細(xì)介紹了java網(wǎng)上圖書商城,購物車模塊第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • springmvc處理異步請求的示例

    springmvc處理異步請求的示例

    這篇文章主要介紹了springmvc處理異步請求的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • java中map和對象互轉(zhuǎn)工具類的實(shí)現(xiàn)示例

    java中map和對象互轉(zhuǎn)工具類的實(shí)現(xiàn)示例

    這篇文章主要介紹了java中map和對象互轉(zhuǎn)工具類的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • vue 實(shí)現(xiàn)刪除對象的元素 delete

    vue 實(shí)現(xiàn)刪除對象的元素 delete

    這篇文章主要介紹了vue 實(shí)現(xiàn)刪除對象的元素delete,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論