如何实现Spring数据源和配置文件数据加密

这篇文章主要为大家展示了如何实现Spring数据源和配置文件数据加密,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

创新互联公司主要从事成都网站建设、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务封丘,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

The following example shows the corresponding XML configuration:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<context:property-placeholder location="jdbc.properties"/>

Spring在第三方依赖包中包含了两个数据源的实现类包,其一是:Apache的DBCP;其二是C3P0,可以在Spring配置文件中利用二者的任何一个配置数据源.

The next two examples show the basic connectivity and configuration for DBCP and C3P0. To learn about more options that help control the pooling features, see the product documentation for the respective connection pooling implementations.

The following example shows DBCP configuration:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<context:property-placeholder location="jdbc.properties"/>

The following example shows C3P0 configuration:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="driverClass" value="${jdbc.driverClassName}"/>
  <property name="jdbcUrl" value="${jdbc.url}"/>
  <property name="user" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<context:property-placeholder location="jdbc.properties"/>

在jdbc.properties文件中定义属性的值,如下:

jdbc.driverClassName=com.MySQL.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3309/sampledb

jdbc.username=root

jdbc.password=123456

但是这些属性是以明文形式存放,那么任何拥有服务器登录权限的人都可以查看这些机密信息,容易造成数据库访问权限的泄露.

这就要求对应用程序配置文件对某些属性进行加密,让Spring容器在读取属性文件后,在内存中对属性进行解密,然后再将解密后的属性赋给目标对象.

这里提供一个加密解密工具(DES对称加密解密)代码:

package com.springboot.utils;

import java.security.Key;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;


public class DESUtils {
  //指定DES加密解密所用的密钥
  private static Key key;
  private static String KEY_STR = "myKey";
  
  static {
    try {
      KeyGenerator generator = KeyGenerator.getInstance("DES");
      generator.init(new SecureRandom(KEY_STR.getBytes()));
      key = generator.generateKey();
      generator = null;
    }catch(Exception e) {
      throw new RuntimeException(e);
    }
  }
  
  public static String getEncryptString(String str) {
    Encoder encoder = Base64.getEncoder();
    try {
      byte[] strBytes = str.getBytes("UTF8");
      Cipher cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] encryptStrBytes = cipher.doFinal(strBytes);
      return encoder.encodeToString(encryptStrBytes);
    }catch(Exception e) {
      throw new RuntimeException(e);
    }
  }
  
  public static String getDecryptString(String str) {
    Decoder decoder = Base64.getDecoder();
    try {
      byte[] strBytes = decoder.decode(str);
      Cipher cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.DECRYPT_MODE, key);
      byte[] decryptStrBytes = cipher.doFinal(strBytes);
      return new String(decryptStrBytes,"UTF8");
    }catch(Exception e) {
      throw new RuntimeException(e);
    }
  }
  
  public static void main(String[] args) throws Exception{
    if(args == null || args.length < 1) {
      System.out.println("请输入要加密的字符,用空格分隔.");
    }else {
      for(String arg : args) {
        System.out.println(arg + ":" + getEncryptString(arg));
      }
    }
  }
}

针对配置文件中加密信息的解密

package com.springboot.utils;

import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

public class EncryptPropertyPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer{
  private String[] encryptPropNames = {"userName","password"};
  
  private boolean isEncryptProp(String propertyName) {
    for(String encryptProName : encryptPropNames) {
      if(encryptProName.equals(propertyName)) {
        return true;
      }
    }
    return false;
  }
  @Override
  protected String convertProperty(String propertyName, String propertyValue) {
    if(isEncryptProp(propertyName)) {
      String decryptVal = DESUtils.getDecryptString(propertyValue);
      System.out.println("decryptVal = " + decryptVal);
      return decryptVal;
    }else {
      return propertyValue;
    }
  }
}

xml配置文件内容

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
  xmlns:util="http://www.springframework.org/schema/util"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd
    http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


   
   <bean class="com.springboot.utils.EncryptPropertyPlaceholderConfigurer"
     p:location="classpath:application.properties"
     p:fileEncoding="utf-8"/>
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close"
      p:driverClassName="${driverClassName}"
    p:url="${url}"
    p:username="${userName}"
    p:password="${password}"/>
</beans>

通过在控制台运行我们的加密代码获取加密后的密文

yusuwudeMacBook-Pro:classes yusuwu$ java com.springboot.utils.DESUtils root 123

获取密文:

root:jxlNoW/DjKw=

123:RbtzyNE4tjY=

在application.properties中配置

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springboot
userName=jxlNoW/DjKw=
password=RbtzyNE4tjY=

以上就是关于如何实现Spring数据源和配置文件数据加密的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看到。

网站栏目:如何实现Spring数据源和配置文件数据加密
本文路径:https://www.cdcxhl.com/article36/iiohsg.html

成都网站建设公司_创新互联,为您提供小程序开发外贸网站建设网站设计搜索引擎优化软件开发域名注册

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站建设