专业的编程技术博客社区

网站首页 > 博客文章 正文

在SpringBoot项目中使用jasypt进行数据脱敏?

baijin 2024-11-13 09:31:22 博客文章 2 ℃ 0 评论

Jasypt框架是在SpringBoot框架中常用的数据加密的框架,使用Jasypt进行数据脱敏操作也会涉及到数据的加密以及解密的过程。虽然要涉及到加密和解密的过程,但是我们还是可以通过这个框架来实现对于敏感数据的脱敏操作,下面我们就来看看如何使用Jasypt框架实现敏感信息的脱敏操作。

添加Jasypt依赖

要使用Jasypt框架,就需要添加Jasypt所使用的依赖如下所示

如果是Maven项目构建,那么就在POM文件中添加如下的依赖。

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.4</version>
</dependency>

如果是用Gradle项目构建,那么就在build.gradle文件中添加如下的依赖。

implementation 'org.jasypt:jasypt-spring-boot-starter:3.0.4'

配置Jasypt

依赖添加之后,需要在项目的配置文件中添加如下的配置

jasypt.encryptor.password=abcdefjhijklmnopqrstuvwxyz

这是在配置文件中添加Jasypt的加密密码,因为这个密码就是在程序执行过程中,用来进行加密解密的密码。

使用Jasypt进行数据加密

要使用Jasypt对数据进行加密,可以使用StringEncryptor类的操作来实现对于数据的加密以及解密操作,可以在控制层调用也可以在服务层中进行调用,如下所示,展示了在服务层中如何进行数据加密调用。

import org.jasypt.util.text.AES256TextEncryptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class EncryptionService {

    private final AES256TextEncryptor textEncryptor;

    public EncryptionService(@Value("${jasypt.encryptor.password}") String encryptionPassword) {
        textEncryptor = new AES256TextEncryptor();
        textEncryptor.setPassword(encryptionPassword);
    }

    public String encrypt(String data) {
        return textEncryptor.encrypt(data);
    }

    public String decrypt(String encryptedData) {
        return textEncryptor.decrypt(encryptedData);
    }
}

在实体类中使用加密

当然除了在逻辑处理中进行调用之外,我们还可以再实体类中进行调用,如下所示,创建了一个实体类,并且在其将数据存入数据库之前进行加密,也就是说存储到数据库中的信息是加密的,然后在数据库读取出库时对数据进行解密,也就是是可以看到一个完整的明文数据,如下所示。就是对手机号进行了加密操作。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.PostLoad;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String username;
    private String encryptedPhoneNumber;

    @Transient
    private String phoneNumber;

    @PrePersist
    @PreUpdate
    public void encryptPhoneNumber() {
        if (phoneNumber != null) {
            this.encryptedPhoneNumber = encryptionService.encrypt(phoneNumber);
        }
    }

    @PostLoad
    public void decryptPhoneNumber() {
        if (encryptedPhoneNumber != null) {
            this.phoneNumber = encryptionService.decrypt(encryptedPhoneNumber);
        }
    }

    // Getters and setters

    // Add an instance of EncryptionService
    @Transient
    private EncryptionService encryptionService = new EncryptionService("your-encryption-password");
}

控制器中使用加密服务

上面我们展示了在Service服务层中对数据的加解密操作,那么下面我们就来看看在控制层进行数据展示的时候,如何对输入数据以及输出数据进行数据加解密操作。如下所示。编写了一个在控制器UserController并且创建了数据加解密调用

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private EncryptionService encryptionService;

    @GetMapping
    public User getUser() {
        User user = new User();
        user.setUsername("john.doe");
        user.setPhoneNumber(encryptionService.encrypt("12345678946"));
        return user;
    }
}

在这个实现中EncryptionService就是用来进行数据加解密操作的服务类我们可以在在属性设置的时候对相关的操作进行处理。

使用Jasypt加密属性

当然Jasypt除了对数据进行传输的加解密之外,还可以对配置项的属性来进行加解密处理,如下所示。在application.properties中对数据库密码信息进行配置的修改。

db.password=ENC(encrypted-database-password)

可以通过在属性值中使用ENC(...)语法进行加密。这里传入的字符串encrypted-database-password就是你通过jasypt:encrypt进行加密之后的密钥,如下所示,就可以生成一个密钥串,在方法中,传入的your-encryption-password,就是需要再配置文件中添加的秘钥。

mvn jasypt:encrypt -Djasypt.encryptor.password=your-encryption-password

这种方式会自动解密属性值,而不需要手动处理。

总结

通过上面的步骤,我们就可以在SpringBoot项目中通过Jasypt框架对数进行脱敏操作,并且可以保证数据在传输过程中的安全性,虽然来说,Jasypt简化了加密过程,但是在使用的过程中还是要对秘钥信息进行保护,避免泄露,造成安全事故。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表