1config AES 加密 · SpringCloud微服务实战 · 看云

导航


本节代码地址


在微服务系统中,隔离服务一般独立部署,数据库一般也会是独立的,服务里面的账号密码如果我们直接暴露在应用的配置文件对应用来说是非常危险的,今天我们就来说一下解决方案之一,就是对敏感信息加密。

在Spring Cloud Config 中,通过直接在密文前面加上{cipher}来对密文进行标注,同时应用在启动的时候回按照规则进行解密,通过这种方式可以对敏感信息进行保护,目前我们常用的加密方式是AES、RSA ,这两种加密的结果每次都会变化。本节主要介绍AES 的加密方式,并且演示的时候只对数据库的密码进行加密。

1. 下载jar 包

默认情况下, 我们使用的jdk 安装后密钥长度是受限制的,这种限制是因为美国对软件出口的控制。
因为我们需要在Java Oracle官方网站下载JCE无限制权限策略文件
JDK7的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

下载后解压,可以看到local_policy.jarUS_export_policy.jar以及readme.txt
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
如果安装了JDK,还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

2. 新建演示模块

新建模块fw-cloud-config-native-client-jce用来测试加密解密的环境演示
3a5a4ce9574bd588e57ecbff0a2399d9_MD5.webp

2.1 maven 配置

引入Config 客户端需要的包和Eureka 的包,因为后面我们基础Eureka 和 Config Server 通信获取配置文件的内容。并且引入了fw-cloud-base-dao(用户表的基本操作),减少重复代码的开发

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.yisu.cloud</groupId>
        <artifactId>fw-cloud-base-dao</artifactId>
        <version>${version}</version>
    </dependency>
    <dependency>
        <groupId>com.yisu.cloud</groupId>
        <artifactId>fw-cloud-common</artifactId>
        <version>${version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

2.2 控制层代码

通过加密后的密码我们查询用户数据,可以验证Spring Cloud Config 是否正确解密。

@RestController
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;



    
    @PostMapping("/getUsers")
    public FwResult getUsers() {
        return FwResult.ok(sysUserService.list());
    }
}

2.3 启动类配置

这里只需要配置@SpringBootApplication注解和服务发现所需要的@EnableDiscoveryClient注解即可

@EnableDiscoveryClient
@SpringBootApplication
public class FwConfigNativeClientJceApplication {
    public static void main(String[] args) {
        SpringApplication.run(FwConfigNativeClientJceApplication.class, args);
    }
}

2.4 应用配置

这里主要配置了端口、应用名称、Config Server 的 服务名

server:
  port: 8780
spring:
  application:
    name: fw-config-jce-rsa
  cloud:
    config: #自己指定的和服务发现的2选1
#      uri: http://localhost:8778/  自己指定的
      profile: dev
      label: master
      discovery: #基于服务发现的
        enabled: true
        service-id: fw-config-server
management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info

搞了这么久也没发现使用AES 加密啊,那是因为配置都在Config Server 那里,下面我们要改造Config Server 了

3. Config Server 端的改造

改造内容

  1. application.yml 修改为bootstrap.yml 主要是为了配置的优先加载
  2. 添加AES 的配置,因为AES 需要设置加密的key
server:
  port: 8778
#config server native模式
spring:
  application:
    name: fw-config-server
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          searchLocations: classpath:/native #  绝对路径 如 file:D:/workspace/fw-repo 相对路径:如classpath:/native
#        overrides:
#          version: 覆盖优先1.0
#      allow-override: true

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

encrypt:
  # aes
  key: fwcloud

3.1 检测加密是否可用

启动Config Server ,使用Postman或浏览器测试localhost:8778/encrypt/status
337a4244d45610d299d4ed1c1b1cbdd5_MD5.png

如果返回的结果是“OK” ,说明加密可以用了

3.2 设置一个加密值

通过Postman Post调用localhost:8778/encrypt
9dbb9c794b867845ce59a1bd8ea4ddd4_MD5.png

解密测试,通过Postman Post 调用 localhost:8778/decrypt
04f4084e171932de46dcb7d2a026b882_MD5.png

3.3 设置fw-config-jce-aes.properties

配置文件我这里使用另一种方式properties,这里使用properties、yml 都没问题,我们这里的spring.datasource.password密码是哪里来的呢?就是3.2 中加密的值

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:mysql://${dbIp}:3306/fw_jwt?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password={cipher}599b232e8c8f7d45733c40baa5de9da9e50a5d955765e6fc15e01a2ce760880e
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=12
spring.datasource.hikari.idle-timeout=300000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
logging.level.com.yisu=debug
version=eureka-jce-2.0

3.4 创建数据库和表

在mysql执行以下语句

CREATE DATABASE fw_jwt;
USE fw_jwt;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `create_user` varchar(100) NOT NULL COMMENT '创建人编码',
  `update_user` varchar(100) NOT NULL COMMENT '修改人编码',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记(1 删除 0未删除)',
  `pos_code` varchar(50) DEFAULT NULL COMMENT '职位编码',
  `disable_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '启用标记(1 禁用 0启用)',
  `avatar` varchar(100) DEFAULT NULL COMMENT '头像地址',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
  `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
  `dept_code` varchar(50) DEFAULT NULL COMMENT '部门编码',
  `user_phone` varchar(15) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `idx_email` (`email`) USING BTREE COMMENT '邮箱索引',
  UNIQUE KEY `idx_user_name` (`user_name`) USING BTREE COMMENT '用户名索引',
  KEY `idx_dept_code` (`dept_code`) USING BTREE COMMENT '部门编码索引',
  KEY `idx_position_code` (`pos_code`) USING BTREE COMMENT '职位编码索引'
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='系统用户表';


4.0 启动测试

需要先启动fw-register-eurekafw-config-server ,然后启动fw-config-jce-ses 客户端
Postman 输入localhost:8780/getUsers测试从数据库获取用户信息
4841f069b301a7b2bb995ceb809f4fbc_MD5.png