Sharding-JDBC数据加密详解与实战

news2024/12/23 19:36:11

在这里插入图片描述

🚀 ShardingSphere 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 ShardingSphere 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🍀 一.Sharding-JDBC数据加密核心概念详解
      • 🥦 1.1 数据加密基本概念
      • 🥦 1.2 基本架构
      • 🥦 1.3 加密规则
      • 🥦 1.4 脱敏处理流程
    • 🍀 二.Sharding-JDBC数据加密实战
      • 🥦 2.1 数据环境准备
      • 🥦 2.2 创建SpringBoot程序 - 导入依赖
      • 🥦 2.3 创建SpringBoot程序 - 实体类
      • 🥦 2.4 创建SpringBoot程序 - 数据库Mapper接口 & 主启动类
      • 🥦 2.5 创建SpringBoot程序 - 数据加密配置文件
    • 🍀 三.Sharding-JDBC数据加密实战测试
      • 🥦 3.1 采用AES对称加密策略测试
      • 🥦 3.2 采用MD5加密策略测试
      • 🥦 3.3 通过密文列查询测试
    • 🍀 四.总结
    • 💬 五.共勉

🍀 一.Sharding-JDBC数据加密核心概念详解

🥦 1.1 数据加密基本概念

  数据加密,是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护,是保证数据安全的基本手段。ShardingSphere 提供完整、透明、安全、低成本的数据加密解决方案。涉及客户安全数据或者一些商业性敏感数据,如身份证号、手机号、卡号、客户号等个人信息按照规定,都需要进行数据脱敏。Apache ShardingSphere自动化&透明化了数据脱敏过程,让用户无需关注数据脱敏的实现细节,像使用普通数据那样使用脱敏数据。

Sharding-JDBC数据加密详解与实战官方指导手册

🥦 1.2 基本架构

数据加密模块属于ShardingSphere分布式治理这一核心功能下的子功能模块:

  • Apache ShardingSphere 通过对用户输入的 SQL 进行解析,并依据用户提供的加密规则对 SQL 进行改写,从而实现对原文数据进行加密,并将原文数据(可选)及密文数据同时存储到底层数据库。

  • 在用户查询数据时,它仅从数据库中取出密文数据,并对其解密,最终将解密后的原始数据返回给用户。

在这里插入图片描述

🥦 1.3 加密规则

脱敏配置主要分为四部分:数据源配置,加密器配置,脱敏表配置以及查询属性配置,其详情如下图所示:
在这里插入图片描述

  • 数据源配置:指DataSource的配置信息

  • 加密器配置:指使用什么加密策略进行加解密。目前ShardingSphere内置了两种加解密策略:AES/MD5

  • 脱敏表配置:指定哪个列用于存储密文数据(cipherColumn)、哪个列用于存储明文数据(plainColumn)以及用户想使用哪个列进行SQL编写(logicColumn)

  • 查询属性的配置:当底层数据库表里同时存储了明文数据、密文数据后,该属性开关用于决定是直接查询数据库表里的明文数据进行返回,还是查询密文数据通过Encrypt-JDBC解密后返回。

🥦 1.4 脱敏处理流程

下图可以看出ShardingSphere将逻辑列与明文列和密文列进行了列名映射。

在这里插入图片描述

下图展示了使用Encrypt-JDBC进行增删改查时,其中的处理流程和转换逻辑,如下图所示。

在这里插入图片描述

🍀 二.Sharding-JDBC数据加密实战

🥦 2.1 数据环境准备

191.168.10.132服务器上创建ljw_encryption_db数据库,然后在数据库中创建t_user表。
在这里插入图片描述

CREATE TABLE `t_user` (
  `user_id` bigint(11) NOT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL COMMENT '密码明文',
  `password_encrypt` varchar(255) DEFAULT NULL COMMENT '密码密文',
  `password_assisted` varchar(255) DEFAULT NULL COMMENT '辅助查询列',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

🥦 2.2 创建SpringBoot程序 - 导入依赖

引入依赖 (注意: 在这里使用ShardingSphere4.1版本为案例进行强制路由的实战)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ljw</groupId>
    <artifactId>shardingjdbc-encryption</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> 
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>

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

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-core-common</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.10</version>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.8</version>
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.5</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

🥦 2.3 创建SpringBoot程序 - 实体类

与数据库表中对应的实体类

@TableName("t_user")
@Data
public class User {

    @TableId(value = "user_id",type = IdType.ASSIGN_ID)
    private Long userId;

    private String userName;

    private String password;

    private String passwordEncrypt;

    private String passwordAssisted;

}

🥦 2.4 创建SpringBoot程序 - 数据库Mapper接口 & 主启动类

编写对应的数据库持久层UserMapper接口

@Repository
public interface UserMapper extends BaseMapper<User> {

    @Insert("insert into t_user(user_id,user_name,password) " +
            "values(#{userId},#{userName},#{password})")
    void insetUser(User users);

    @Select("select * from t_user where user_name=#{userName} and password=#{password}")
    @Results({
            @Result(column = "user_id", property = "userId"),
            @Result(column = "user_name", property = "userName"),
            @Result(column = "password", property = "password"),
            @Result(column = "password_assisted", property = "passwordAssisted")
    })
    List<User> getUserInfo(String userName, String password);
}

@Repository注解的类需要交给我们的Spring容器进行管理,因此需要我们在主启动类加上扫描接口的注解。

@SpringBootApplication
@MapperScan("com.ljw.mapper")
public class ShardingSphereApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShardingSphereApplication.class, args);
    }
}

🥦 2.5 创建SpringBoot程序 - 数据加密配置文件

配置读写分离相关配置的信息

# 应用名称
spring.application.name=sharding-jdbc-encryption

# 打印SQl
spring.shardingsphere.props.sql-show=true

# 定义多个数据源
spring.shardingsphere.datasource.names = db1

# 数据源1
spring.shardingsphere.datasource.db1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db1.jdbc-url=jdbc:mysql://192.168.10.132:3306/ljw_encryption_db?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.shardingsphere.datasource.db1.username=root
spring.shardingsphere.datasource.db1.password=root

# 采用MD5加密策略
spring.shardingsphere.encrypt.encryptors.encryptor_md5.type=MD5

# password为逻辑列,password.plainColumn为数据表明文列,password.cipherColumn为数据表密文列
spring.shardingsphere.encrypt.tables.t_user.columns.password.plainColumn=password
spring.shardingsphere.encrypt.tables.t_user.columns.password.cipherColumn=password_encrypt
spring.shardingsphere.encrypt.tables.t_user.columns.password.encryptor=encryptor_md5

# 查询是否使用密文列 ,等于true 查询时通过密文列查询,返回数据为密文,反之查询通过明文列执行,返回数据也是明文列
spring.shardingsphere.props.query.with.cipher.column=true

## 采用AES对称加密策略
#spring.shardingsphere.encrypt.encryptors.encryptor_aes.type=aes
#spring.shardingsphere.encrypt.encryptors.encryptor_aes.props.aes.key.value=123qweasd
#
## password为逻辑列,password.plainColumn为数据表明文列,password.cipherColumn为数据表密文列
#spring.shardingsphere.encrypt.tables.t_user.columns.password.plainColumn=password
#spring.shardingsphere.encrypt.tables.t_user.columns.password.cipherColumn=password_encrypt
#spring.shardingsphere.encrypt.tables.t_user.columns.password.encryptor=encryptor_aes

# 查询是否使用密文列 ,等于true 查询时通过密文列查询,返回数据为明文,反之查询通过明文列执行,返回数据也是明文列
#spring.shardingsphere.props.query.with.cipher.column=true

🍀 三.Sharding-JDBC数据加密实战测试

🥦 3.1 采用AES对称加密策略测试

AES 对称加密: 同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密!

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsertUser(){
        User user = new User();
        user.setUserName("ljw");
        user.setPassword("root");
        userMapper.insertUser(user);
    }

运行结果:

在这里插入图片描述

数据插入成功!

在这里插入图片描述

🥦 3.2 采用MD5加密策略测试

MD5非对称加密:

  • MD5算是一个生成签名的算法,引起结果不可逆.

  • MD5的优点:计算速度快,加密速度快,不需要密钥;

  • MD5的缺点: 将用户的密码直接MD5后存储在数据库中是不安全的。很多人使用的密码是常见的组合,威胁者将这些密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。

	@Autowired
    private UserMapper userMapper;

    @Test
    public void testInsertUser(){
        User user = new User();
        user.setUserName("ljw");
        user.setPassword("root");
        userMapper.insertUser(user);
    }

运行结果:

在这里插入图片描述
数据插入成功!!!
在这里插入图片描述

🥦 3.3 通过密文列查询测试

测试代码

	@Test
    public void testSelect(){
        List<User> userList = userMapper.getUserInfo("ljw", "root");
        userList.forEach(System.out::println);
    }

结果查询

🍀 四.总结

本篇文章主要讲解了Sharding-JDBC数据加密详解与实战,实操过程非常重要,大家一定要动手亲自实践一下,必须掌握。下节预告,Sharding-JDBC分布式事务实战,大家敬请期待呦!!!。

💬 五.共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进销存+小程序商城一体化,多门店管理解决方案-免费试用|亿发

为了适应市场变化和增强管理效率&#xff0c;越来越多的连锁&#xff0c;门店开始转向进销存小程序商城一体化&#xff0c;将进销存与订货商城结合&#xff0c;以实现更便捷、有效的经营模式&#xff0c;让企业迈向数字化时代。让我们一起来看看进销存小程序商城一体化系统相比…

掌握企业声音:企业新闻舆情查询API的重要作用与应用

摘要 在信息时代&#xff0c;企业的声誉和形象可以在瞬息万变的新闻舆情中受到影响。为了保护企业的声誉和形象&#xff0c;以及及时洞察市场动向&#xff0c;企业新闻舆情查询 API 应运而生。本文将探讨企业新闻舆情查询 API 的重要作用与应用&#xff0c;以及它在帮助企业实…

Linux输出内容到指定文件

1. 记录终端输出至文本文件 1.1 解决方案1&#xff1a;利用>和>>命令 区别&#xff1a; > 是把输出转向到指定的文件。注意&#xff1a;如文件已存在的话会重新写入&#xff0c;文件原内容不会保留。 >> 是把输出附加到文件的后面&#xff0c;文件原内容会…

车间生产线数据采集网关让生产透明化

**钡铼技术加工车间解决方案&#xff0c;通过把网关安装至一体电控箱控制生产设备&#xff0c;并与控制传输带的PLC结合&#xff0c;打造出了一个易部署、易维护、高可靠性&#xff0c;可24小时作业的自动化生产产线。 为什么采集数据&#xff1f;——实现生产透明化 1、数据…

【LeetCode】96.不同的二叉搜索树

题目 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xf…

C. Maximum Set

Problem - 1796C - Codeforces 思路&#xff1a;这个题在做的时候基本的思路是对的&#xff0c;但是没有想到O(1)求答案&#xff0c;枚举的然后T了&#xff0c;我们能够知道&#xff0c;假设前面的数小&#xff0c;那么每个数一定是前面的倍数&#xff0c;所以至少乘以2&#x…

C++ easyx大一期末作业利器

yNodeGUI_v2.0 紧跟着1.0版本的完成&#xff0c;又到了激动人心的C期末作业了。(上学期是C语言的),这学期&#xff0c;我仅仅改了一点点上学期的期末作业&#xff0c;然后很轻松的水…啊不&#xff0c;完成了这次的期末作业。 所以&#xff0c;大家一定要注重复用&#xff01…

go学习 4、复合数据类型

4、复合数据类型 数组、slice、map和结构体 如何使用结构体来解码和编码到对应JSON格式的数据&#xff0c;并且通过结合使用模板来生成HTML页面 数组和结构体是聚合类型;它们的值由许多元素或成员字段的值组成。数组是由同构的元素组成&#xff08;每个数组元素都是完全相同的…

【2023】分享国内外大厂开发主要AI网站

大厂原版 OpenAI ChatGPT 921 New Bing 415 Notion AI 90 百度文心一言 467 TruthGPT 105 讯飞星火认知大模型 141 进阶 Hugging Face 62 写作AI ​ Dyrt 394&#xff08;AI写作&#xff09; ​ DeepL Write 211&#xff08;写作翻译&#xff09; ​AI自动写文章 535 …

怎么转换音频格式?音频格式转换方法分享

当我们在处理音频文件时&#xff0c;可能会遇到一些问题。一些设备和应用程序可能无法播放特定的音频格式&#xff0c;或者需要将音频文件发送给其他人&#xff0c;但他们无法打开该格式。此外&#xff0c;某些网站和应用程序可能只支持特定类型的音频格式&#xff0c;因此我们…

数字孪生的现实意义及不足之处

数字孪生作为一项前沿技术&#xff0c;在当今数字化转型浪潮中发挥着越来越重要的作用。它是将物理世界和数字世界紧密结合的桥梁&#xff0c;为现实问题提供了全新的解决方案。然而数字孪生在现实生活中有什么现实意义嘛&#xff1f;实现难点又在哪&#xff1f;下面简单从几个…

多线程面试题--线程池

目录 介绍 线程池的核心参数/执行原理 核心参数 执行原理​编辑 常见的阻塞队列 ArrayBlockingQueue和LinkedBlockingQueue区别 如何确定核心线程数 线程池的种类有哪些 创建使用固定线程数的线程池 单线程化的线程池 可缓存线程池 “延迟”和“周期执行”的线程池 总…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第三十八天 38/50【归并排序】【链表第一个交点】【二分】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

计算机是如何计算四则运算表达式的?

&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;博主大一智能制造在读&#xff0c;热爱C/C&#xff0c;会不定期更新系统、语法、算法、硬件的相关博客&#xff0c;浅浅期待下一次更新吧&#xff01; ✈️算法专栏&#xff1a;算法与数据结构 &#x1f618;博客制…

Python爬虫实战(基础篇)—4获取古诗词给孩子学习(附完整代码)

今天我们来获取古诗词网站的一些古诗词来提供给孩子们学习 PS前面几节课的内容在专栏这里&#xff0c;欢迎大家考古&#xff1a;点我 首先我们看一下网站&#xff1a;点我&#xff0c;今天我们来获取一下【唐诗三百首】 第 1 步&#xff1a;网页分析 在网页中我们发现有许多以…

KnowStreaming系列教程第三篇——调度任务模块

前一篇文章KnowStreaming系列教程第二篇——项目整体架构分析_诸葛子房_的博客-CSDN博客 讲述了KS的整体项目目录&#xff0c;这边文章来讲述下KS在调度模块里面对于指标采集和元数据同步 一、调度模块代码主要在km-task里面 public class TaskClusterAddedListener impleme…

Docker-compose简介和部署编排 and Docker 私有仓库Harbor的简介和部署

Docker-compose简介和部署编排 and Docker 私有仓库的简介和部署 一、Docker-compose简介Ⅰ、compose概述Ⅱ、YAML 文件格式及编写注意事项Ⅲ、YAML支持的数据结构 二、compose部署安装Ⅰ、Docker Compose 环境安装Ⅱ、Docker Compose配置常用字段Ⅲ、Docker Compose 常用命令 …

【工具】js字符串扩展格式化方法format 格式化文本

有序的格式化文本&#xff0c;使用{number}做为占位符 通常使用&#xff1a;format("this is {0} for {1}", "a", "b") 》 this is a for b 形参: pattern – 文本格式 arguments – 参数 返回值: 格式化后的文本 /*** 设置字符串format函数* …

汽车分析,随时间变化的燃油效率

简述 今天我们来分析一个汽车数据。 数据集由以下列组成&#xff1a; 名称&#xff1a;每辆汽车的唯一标识符。MPG&#xff1a;燃油效率&#xff0c;以英里/加仑为单位。气缸数&#xff1a;发动机中的气缸数。排量&#xff1a;发动机排量&#xff0c;表示其大小或容量。马力&…

torchsort安装报错:ModuleNotFoundError: No module named ‘torch‘

【问题】 安装torchsort时报错ModuleNotFoundError: No module named torch。 但实际已安装torch。 【解决】 是pip版本的问题&#xff0c;回退至旧版即可。 pip --version # 查看当前pip版本 pip install pip # 查看pip所有版本 pip install pip23.0 # 回退pip至较新版本&…