隐私数据脱敏

1、引入依赖

  1. <!--jasypt加解密-->
  2. <dependency>
  3. <groupId>com.github.ulisesbocchio</groupId>
  4. <artifactId>jasypt-spring-boot-starter</artifactId>
  5. <version>3.0.4</version>
  6. </dependency>

2、加解密配置

配置文件加入秘钥配置项jasypt.encryptor.password,
并将需要脱敏的value值替换成预先经过加密的内容ENC(加密后的字符串)
例如:

jasypt:
  encryptor:
    password: asdaszdsad

3、api调用

@SpringBootTest
public class DarkCloudTest {

    @Autowired
    private StringEncryptor stringEncryptor;

    @Test
    void encryptPwd() {

        //加密
        System.out.println("加密root: " + stringEncryptor.encrypt("root"));
        System.out.println("加密druid: " + stringEncryptor.encrypt("druid"));
        System.out.println("加密123456: " + stringEncryptor.encrypt("123456"));
    }

}

4、使用加密

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&ze oDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
    username: root
    password: ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)

5、自定义加密写法

ENC()是默认的写法,我们可以进行定义并自定义格式

jasypt:
  encryptor:
    property:
      prefix: "abc["
      suffix: "]"

参数注入启动

秘钥是个安全性要求比较高的属性,所以一般不建议直接放在项目内,可以通过启动时-D参数注入,或者放在配置中心,避免泄露

java -jar -Djasypt.encryptor.password=1123 jasypt.jar

AOP全局处理

对于某些情况下可能有多个数据需要进行加密,从数据库查询出来之后需要解密
这个时候可以使用AOP进行切面编程,全局处理,高效快捷
而且还是无侵入式的

自定义注解

自定义两个注解
字段加密注解和方法加密注解

@EncryptField/@EncryptMethod

在使用的地方添加注解即可
通常对用户的隐私数据进行加密,比如手机号、身份证或者一些账号配置等信息,入库时都要进行不落地脱敏,也就是在进入我们系统时就要实时的脱敏处理。

定义如下:

@Documented
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptField {

    String[] value() default "";
}

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptMethod {
    String type() default ENCRYPT;
}

public interface EncryptConstant {
    String ENCRYPT = "encrypt";
    String DECRYPT = "decrypt";
}

测试实体

@Data
public class User {
    private Long userId;

    @EncryptField
    private String mobile;

    @EncryptField
    private String address;

    private String age;
}

切面编程

对其进行入参加密,返回结果解密