Escenas
Para evitar la fuga de datos, es necesario cifrar y almacenar los campos de una tabla en la base de datos durante operaciones como la inserción, y mostrarlos en texto sin formato cuando se requiera una consulta.
Esfera fragmentada
ShardingSphere es un ecosistema compuesto por una solución de middleware de base de datos distribuida de código abierto.
Consta de tres productos independientes: Sharding-JDBC, Sharding-Proxy y Sharding-Sidecar (planeado).
Todos proporcionan fragmentación de datos estandarizados, transacciones distribuidas y funciones de control de bases de datos, y son aplicables a lenguajes Java homogéneos, heterogéneos y nativos de la nube.
y otros diversos escenarios de aplicación.
ShardingSphere se posiciona como un middleware de base de datos relacional, cuyo objetivo es utilizar completa y razonablemente las capacidades informáticas y de almacenamiento de las bases de datos relacionales en escenarios distribuidos.
En lugar de implementar una nueva base de datos relacional. Coexiste con NoSQL y NewSQL pero no se excluyen mutuamente.
Como fronteras de la exploración de nuevas tecnologías, NoSQL y NewSQL son muy recomendables para mirar hacia el futuro y aceptar los cambios.
La desensibilización de datos es solo uno de los módulos, y la siguiente es la descripción del documento oficial.
Desensibilización de datos:: ShardingSphere
Nota:
Blog:
Temperamento pícaro autoritario blog_CSDN Blog-C#, Architecture Road, Blogger en SpringBoot
lograr
1. Cree un nuevo proyecto SpringBoot e introduzca dependencias
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
2. Modifique la configuración de la fuente de datos original en el archivo de configuración yml para shardingsphere y configure el cifrado y otras reglas relacionadas
Configuración del origen de datos antes de la modificación
# 数据源
spring:
application:
name: apiDataDesensitizationDemo
datasource:
url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 150 # 等待连接获取的最大超时时间
Configuración de fuente de datos modificada
# 数据源
spring:
application:
name: apiDataDesensitizationDemo
shardingsphere:
datasource:
names: ds0
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
Agregar configuración de reglas relacionadas con el cifrado
# 数据源
spring:
application:
name: apiDataDesensitizationDemo
shardingsphere:
datasource:
names: ds0
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
encrypt:
tables:
t_user:
columns:
name:
#plainColumn: pwd_plain
cipherColumn: name
encryptor: pwdEncrypt
encryptors:
pwdEncrypt:
type: AES
props:
aes:
key:
value: 123456
props:
query:
with:
cipher:
column: true #是否使用密文列查询,false 则查询时返回密文,true则查询时返回明文
Tenga en cuenta que en el archivo de configuración aquí, se indica que el atributo de nombre de la tabla t_user debe cifrarse, y la columna de almacenamiento de texto cifrado también se especifica como nombre,
Si necesita almacenar texto sin formato, puede configurar plainColumn.
El siguiente es el cifrador especificado, el tipo AES está integrado y la clave secreta es 123456.
La siguiente configuración #Si se usa la consulta de columna de texto cifrado, false devolverá el texto cifrado al realizar la consulta, true devolverá el texto sin formato al realizar la consulta
3. Cree una nueva tabla de prueba t_user
Luego genere los códigos de cada capa de acuerdo con esta tabla, que se omite aquí.
Solo código de clase de entidad
@Data
public class User implements Serializable {
private static final long serialVersionUID = -5514139686858156155L;
private Integer id;
private Integer userId;
private String name;
private Integer age;
}
4. Cree un nuevo controlador para consulta de prueba y consulta
@RequestMapping("user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("save")
public String save() {
User user = new User();
user.setUserId(new Random().nextInt( 1000 ) + 1);
user.setName("张三"+user.getUserId());
user.setAge(new Random().nextInt( 80 ) + 1);
userService.insert(user);
return "save success";
}
@RequestMapping("findAll")
public String findAll() {
List<User> all = userService.findAll();
return all.toString();
}
}
Comience y pruebe la inserción, el resultado es como se muestra en la figura anterior y se almacena como texto cifrado en la base de datos.
Luego llame a la consulta. Cuando la configuración anterior es verdadera, la consulta devuelve texto sin formato
Cámbielo a falso, entonces la consulta es texto cifrado