ShardingSphere应用专题--4.1.1版本--Sharding-JDBC字段加。。。

ShardingSphere应⽤专题--4.1.1版本--Sharding-JDBC字段加。。。
前⾔
1.基础的环境介绍请移步
你可以同时打开两个页⾯,避免因查原始配置上下翻动。
2.ShardingSphere更新不及时,很容易踩坑。贴出的4.x版本⽂档实际是4.0.1版本的,如果你准备使⽤该版本可以参考官⽅⽂档。本⽂使⽤的是此时最新的正式版本4.1.1版本,配置与官⽅⽂档配置不同。事实上,源码中有⾮常详细的版本配置⽂档,本⽂也是参考4.1.1 tag的源码配置。
3.ShardingSphere各版本差异很⼤,甚⾄核⼼依赖的包名都不⼀样,使⽤时,⼀定要确认使⽤哪个版本,⽬前调研的结果:3.x、
4.0.1、
4.1.1、
5.0.0-alpha都存在很⼤的配置差异
4.关于字段加密的场景参阅:
中间件脱敏服务优势
1. ⾃动化&透明化数据脱敏过程,⽤户⽆需关注脱敏中间实现细节。
2. 提供多种内置、第三⽅(AKS)的脱敏策略,⽤户仅需简单配置即可使⽤。
3. 提供脱敏策略API接⼝,⽤户可实现接⼝,从⽽使⽤⾃定义脱敏策略进⾏数据脱敏。管秩
4. ⽀持切换不同的脱敏策略。
共享雨伞现身杭州
5. 针对已上线业务,可实现明⽂数据与密⽂数据同步存储,并通过配置决定使⽤明⽂列还是密⽂列进⾏查询。可实现在不改变业务查询
SQL前提下,已上线系统对加密前后数据进⾏安全、透明化迁移。
适⽤场景说明
1. ⽤户项⽬使⽤Java语⾔进⾏编程。
2. 后端数据库为MySQL、Oracle、PostgreSQL、SQLServer。
3. ⽤户需要对数据库表中某个或多个列进⾏脱敏(数据加密&解密)。
4. 兼容所有常⽤SQL。
限制条件
1. ⽤户需要⾃⾏处理数据库中原始的存量数据、洗数。
2. 使⽤脱敏功能+分库分表功能,部分特殊SQL不⽀持,请参考。
3. 脱敏字段⽆法⽀持⽐较操作,如:⼤于⼩于、ORDER BY、BETWEEN、LIKE等。
4. 脱敏字段⽆法⽀持计算操作,如:AVG、SUM以及计算表达式 。
加密策略解析
ShardingSphere提供了两种加密策略⽤于数据脱敏,该两种策略分别对应ShardingSphere的两种加解密的接⼝,即ShardingEncryptor 和ShardingQueryAssistedEncryptor。
⼀⽅⾯,ShardingSphere为⽤户提供了内置的加解密实现类,⽤户只需进⾏配置即可使⽤;另⼀⽅⾯,为了满⾜⽤户不同场景的需求,我们还开放了相关加解密接⼝,⽤户可依据该两种类型的接⼝提
供具体实现类。再进⾏简单配置,即可让ShardingSphere调⽤⽤户⾃定义的加解密⽅案进⾏数据脱敏。
ShardingEncryptor
该解决⽅案通过提供encrypt(), decrypt()两种⽅法对需要脱敏的数据进⾏加解密。在⽤户进⾏INSERT, DELETE,
UPDATE时,ShardingSphere会按照⽤户配置,对SQL进⾏解析、改写、路由,并会调⽤encrypt()将数据加密后存储到数据库, ⽽
在SELECT时,则调⽤decrypt()⽅法将从数据库中取出的脱敏数据进⾏逆向解密,最终将原始数据返回给⽤户。
当前,ShardingSphere针对这种类型的脱敏解决⽅案提供了两种具体实现类,分别是MD5(不可逆),AES(可逆),⽤户只需配置即可使⽤这两种内置的⽅案。
ShardingQueryAssistedEncryptor
相⽐较于第⼀种脱敏⽅案,该⽅案更为安全和复杂。它的理念是:即使是相同的数据,如两个⽤户的
密码相同,它们在数据库⾥存储的脱敏数据也应当是不⼀样的。这种理念更有利于保护⽤户信息,防⽌撞库成功。
它提供三种函数进⾏实现,分别是encrypt(), decrypt(), queryAssistedEncrypt()。在encrypt()阶段,⽤户通过设置某个变动种⼦,例如时间戳。针对原始数据+变动种⼦组合的内容进⾏加密,就能保证即使原始数据相同,也因为有变动种⼦的存在,致使加密后的脱敏数据是不⼀样的。在decrypt()可依据之前规定的加密算法,利⽤种⼦数据进⾏解密。
虽然这种⽅式确实可以增加数据的保密性,但是另⼀个问题却随之出现:相同的数据在数据库⾥存储的内容是不⼀样的,那么当⽤户按照这个加密列进⾏等值查询(SELECT FROM table WHERE encryptedColumnn = ?)时会发现⽆法将所有相同的原始数据查询出来。为此,我们提出了辅助查询列的概念。该辅助查询列通过queryAssistedEncrypt()⽣成,与decrypt()不同的是,该⽅法通过对原始数据进⾏另⼀种⽅式的加密,但是针对原始数据相同的数据,这种加密⽅式产⽣的加密数据是⼀致的。将queryAssistedEncrypt()后的数据存储到数据中⽤于辅助查询真实数据。因此,数据库表中多出这⼀个辅助查询列。
由于queryAssistedEncrypt()和encrypt()产⽣不同加密数据进⾏存储,⽽decrypt()可逆,queryAssistedEncrypt()不可逆。 在查询原始数据的时候,我们会⾃动对SQL进⾏解析、改写、路由,利⽤辅助查询列进⾏
WHERE条件的查询,却利⽤ decrypt()对encrypt()加密后的数据进⾏解密,并将原始数据返回给⽤户。这⼀切都是对⽤户透明化的。
当前,ShardingSphere针对这种类型的脱敏解决⽅案并没有提供具体实现类,却将该理念抽象成接⼝,提供给⽤户⾃⾏实现。ShardingSphere将调⽤⽤户提供的该⽅案的具体实现类进⾏数据脱敏。
在Apache ShardingSphere中,很多功能实现类的加载⽅式是通过SPI注⼊的⽅式完成的。 Service Provider Interface (SPI)是⼀种为了被第三⽅实现或扩展的API,它可以⽤于实现框架扩展或组件替换。具体官⽅预留的SPI扩展的接⼝参阅:
SPI简单说,就是定义了⼀种扩展机制,按照SPI的规定,在/resources/根⽬录下创建/META-INF/services,创建⽂件,⽂件名为你要扩展的接⼝的【全限定类名】,然后⽂件内部填写你的⼦类实现的【全限定类名】。这样⼦类就可以被SPI机制加载到内存中了
简单举例
⽐如有⼀个接⼝的【全限定类名】为 com.a.b.AInterface,他的⼦类的【全限定类名】为d.BImplements ⽗接⼝AInterface⽀持SPI扩展机制
在/resources/META-INF/services定义com.a.b.AInterface的⽂件(没有后缀),内容是d.BImpl
ements
代码实现⾃定义加密
⾃定义模块官⽅给的SPI扩展接⼝为org.pt.strategy.spi.Encryptor
(1)⼦类实现Encryptor
ample.pt;
import lombok.Data;
import lombok.NoArgsConstructor;
slf4j.Slf4j;
import dec.digest.DigestUtils;
import org.pt.strategy.spi.Encryptor; import java.util.Properties;
@NoArgsConstructor
黄桥打会
@Data
@Slf4j
public final class Sha256Encryptor implements Encryptor { private Properties properties =new Properties();
@Override
public void init(){
}
@Override
public String encrypt(final Object plaintext){
if(null == plaintext){
return null;
}
log.info("Sha256Encryptor encrypt,value:{}", plaintext);
return DigestUtils.sha256Hex(String.valueOf(plaintext));
孝心献给父母}
@Override
public Object decrypt(final String ciphertext){
log.info("Sha256Encryptor decrypt,value:{}", ciphertext);
return ciphertext;
}
@Override
public String getType(){
return"sha256";
}
@Override
public void setProperties(Properties properties){
if(properties == null){
return;生物制药板块
}
this.properties = properties;
中华蝎王}
}
加密类型定义为[sha256]
(2)按照SPI扩展的规定,创建配置⽂件
⽂件内容为(1)中⼦类的【全限定类名】
(3)配置⽂件启⽤⾃定义加密
#打印sql
spring.shardingsphere.props.sql.show=true
#设置单次请求可适⽤的最⼤线程数,以决定是线程限制还是内存限制。增⼤该参数可提⾼数据库元数据加载速度(默认为1)spring.shardingsphere.tions.size.per.query=3
spring.shardingsphere.datasource.names=master
spring.shardingsphere.pe=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.sql.cj.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://localhost:4406/mydb?characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=111
pt.lumns.bill_name.cipherColumn=bill_name_cipher
pt.lumns.ptor=encryptor_customize
pe=sha256
ptor_customize.props.aes.key.value
代码测试
⽇志上可以看到,⾃定义的加密策略被使⽤了

本文发布于:2024-09-22 18:13:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/470229.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   加密   实现   版本   查询
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议