【Sharding Sphere、Spring Boot】Spring Boot整合Sharding Sphere Jdbc(5.0.0):数据加密

一、Sharding Sphere基本介绍

官网链接推荐:跳转官网 | 5.0.0中文文档 | 数据加密介绍

二、环境准备

-- auto-generated definition
create table t_user
(
    user_id           varchar(32)  not null comment '用户id'
        primary key,
    user_name         varchar(255) null comment '用户名称',
    password_show     varchar(255) null comment '密码明文',
    password_encrypt  varchar(255) null comment '密码密文',
    password_assisted varchar(255) null comment '辅助查询列'
)
    comment 'Sharding Sphere数据加密测试' collate = utf8mb4_bin;

三、Spring Boot整合Sharding Sphere Jdbc实现数据加密

1、引入pom.xml依赖

		 <!--sharding-jdbc-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.0.0</version>
        </dependency>

2、application.yml配置文件


# ShardingSphere 数据加密
spring:
  shardingsphere:
    datasource:
      # 数据源
      names: master
      # 主库
      master:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:7000/cyun_sharding_sphere?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.zaxxer.hikari.HikariDataSource
    # 使用模式,支持三种模式:内存模式、单机模式、集群模式
    mode:
      type: Memory
    props:
      # 打印sql
      sql-show: true
      query:
        with:
          cipher:
            column: true
    rules:
      # 数据加密
      encrypt:
        # 加密算法配置
        encryptors:
          # 注意:此处命名不能使用“_”,否则启动报错
          password-encryptor:
            # 加密算法属性配置
            props:
              aes-key-value: 123456abc
            # 加密算法类型
            type: AES
        tables:
          t_user:
            columns:
              password_encrypt:
#                # 加密列名称
                cipher-column: password_encrypt
                # 查询列名称
#                assisted-query-column: password_assisted
                # 原文列名称
                plain-column: password_show
                # 加密算法名称
                encryptor-name: password-encryptor
        # 是否使用加密列进行查询。在有原文列的情况下,可以使用原文列进行查询
        queryWithCipherColumn: true

3、测试类

package com.cyun.demo.sharding.sphere.encryption.controller;

import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.cyun.core.result.ResultVO;
import com.cyun.demo.sharding.sphere.encryption.entity.User;
import com.cyun.demo.sharding.sphere.encryption.service.impl.UserServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 数据加密测试类
 * 
 * @author He PanFu
 * @date 2022-04-20 11:39:11
 */
@Slf4j
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
public class TestController {

    private final UserServiceImpl userService;

    @GetMapping(value = "/list")
    public ResultVO list() {
        final List list = userService.list();
        return ResultVO.ok(list.size());
    }

    @GetMapping(value = "/add")
    public ResultVO add() {
        User userEntity = new User();
        userEntity.setUserId(IdWorker.getIdStr());
        userEntity.setUserName("user19");
        // 加密字段
        userEntity.setPasswordEncrypt("123456");
        userService.save(userEntity);
        return ResultVO.ok();
    }
}

4、控制台日志

新增
在这里插入图片描述
查询
在这里插入图片描述

在这里插入图片描述

四、SPI自定义加密算法

1、官网文档提供SPI

在这里插入图片描述

2、创建自定义加密算法Sha256Encryptor实现EncryptAlgorithm

package com.cyun.demo.sharding.sphere.encryption.config;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;

/**
 * 自定义数据加密策略
 *
 * @author He PanFu
 * @date 2022-04-20 11:39:11
 */
public class Sha256Encryptor implements EncryptAlgorithm {

    @Override
    public void init() {

    }

    @Override
    public String encrypt(Object plaintext) {
        if (null == plaintext) {
            return null;
        }
        return DigestUtils.sha256Hex(String.valueOf(plaintext));
    }

    @Override
    public Object decrypt(String ciphertext) {
        return ciphertext;
    }

    @Override
    public String getType() {
        return "SHA256";
    }
}

在resources/META-INF/services目录下新增配置,并配置文件名字为:org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm
在这里插入图片描述
配置文件里的内容,放入自定义的加密策略的类的全路径
在这里插入图片描述
application.yml配置文件修改
在这里插入图片描述
在这里插入图片描述

3、创建自定义加密算法Sha256RandomEncryptor实现QueryAssistedEncryptAlgorithm(包含查询辅助列的数据加密算法)

package com.cyun.demo.sharding.sphere.encryption.config;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.shardingsphere.encrypt.spi.QueryAssistedEncryptAlgorithm;

import java.time.LocalDateTime;

/**
 * 自定义数据加密策略
 *
 * @author He PanFu
 * @date 2022-04-20 11:39:11
 */
public class Sha256RandomEncryptor implements QueryAssistedEncryptAlgorithm {
    @Override
    public String queryAssistedEncrypt(Object o) {
        if (null == o) {
            return null;
        }
        // 原始字符串
        return DigestUtils.sha256Hex(String.valueOf(o));
    }

    @Override
    public String encrypt(Object o) {
        if (null == o) {
            return null;
        }
        // 原始字符串+变动因子(如时间戳)
        o = o + LocalDateTime.now().toString();
        return DigestUtils.sha256Hex(String.valueOf(o));
    }

    @Override
    public Object decrypt(String s) {
        return s;
    }

    @Override
    public void init() {

    }

    @Override
    public String getType() {
        return "SHA256_RANDOM";
    }
}

注意:具体配置同上

参考文档:
ShardingSphere4.1.1:Sharding-JDBC数据加密及SPI加密策略实现。注意:该文档使用的版本是4.1.1,而本文使用的则是5.0.0,注意版本问题。
spring-boot集成Apache ShardingSphere 5.0.0 感知

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值