SpringBoot与Jasypt整合,实现数据库字段自动加密解密功能

数据库 其他数据库
使用Jasypt可以显著提升应用程序的数据安全性,简化加密操作,并提供灵活的配置选项。不仅有助于满足各种法规要求,还能提高开发效率和系统的整体稳定性。

使用Jasypt可以显著提升应用程序的数据安全性,简化加密操作,并提供灵活的配置选项。不仅有助于满足各种法规要求,还能提高开发效率和系统的整体稳定性。

Jasypt的好处

保护敏感信息

  • 用户数据: 加密存储用户密码、个人身份信息(PII)、信用卡信息等敏感数据,防止未经授权的访问。
  • 商业机密: 保护内部业务数据和知识产权,避免数据泄露带来的经济损失和法律风险。

法规遵从性

  • GDPR: 欧盟通用数据保护条例要求对个人数据进行加密存储。
  • CCPA: 加利福尼亚消费者隐私法案规定了对消费者数据的严格保护措施。
  • HIPAA: 健康保险流通与责任法案要求对医疗记录进行加密。
  • PCI DSS: 支付卡行业数据安全标准要求对支付数据进行加密处理。

易于集成

  • 注解支持: 使用@Encryptable注解可以轻松地在实体类中标记需要加密的字段,无需编写复杂的加密逻辑。
  • 自动处理: Jasypt会自动处理加密和解密过程,减少开发工作量。

标准化API

  • 统一接口: 提供简单且一致的API,使得开发者可以快速上手并实现加密功能。
  • 文档丰富: 提供详细的文档和示例代码,帮助开发者理解和使用Jasypt。

多种加密算法

  • 选择多样: Jasypt支持多种加密算法(如AES、PBEWithMD5AndDES等),可以根据具体需求选择合适的加密方式。
  • 自定义配置: 可以通过配置文件或环境变量灵活地设置加密参数,便于管理和维护。

动态密钥管理

  • 密钥轮换: 支持密钥轮换机制,定期更换密钥以增强安全性。
  • 密钥存储: 可以将密钥存储在安全的地方,如环境变量、配置服务器或秘密管理系统(如HashiCorp Vault)。

高效的加密和解密

  • 低开销: 设计目标是尽量减少对应用性能的影响,确保加密操作不会显著降低系统的响应速度。
  • 缓存机制: 使用缓存机制来提高加密和解密操作的效率。

应用场景

用户认证系统

  • 密码存储: 使用Jasypt对用户密码进行加密存储,即使数据库被攻破,攻击者也无法轻易获取明文密码。
  • 登录验证: 在用户登录时,自动解密存储的密码并与输入的密码进行比较。

电子商务平台

  • 订单信息: 加密存储用户的支付信息和地址信息,确保交易的安全性。
  • 客户数据: 保护客户的个人资料和偏好设置,防止数据泄露。

医疗信息系统

  • 患者记录: 加密存储患者的病历和个人信息,符合HIPAA法规要求。
  • 药物库存: 保护敏感的药品库存信息,防止未授权访问。

代码实操

<!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- Jasypt Dependency -->
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.4</version>
    </dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

application.properties

# Database Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/mytestdb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update

# Jasypt Configuration
jasypt.encryptor.password=yourSecretKey
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

在实体类中标记需要加密的字段

import org.jasypt.annotation.Encryptable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

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

    @Encryptable
    private String username;

    @Encryptable
    private String email; // 邮箱字段,需要加密

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

Repository

标准的JPA操作,不需要额外的配置来支持加密功能。

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

    @Autowired
    private UserRepository userRepository;

    @PostMapping("/")
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userRepository.findById(id).orElse(null);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

测试

创建用户

curl -X POST http://localhost:8080/users/ -H "Content-Type: application/json" -d '{"username": "testuser", "email": "test@example.com"}'
  • 1.

Respons:

{
    "id": 1,
    "username": "testuser",
    "email": "test@example.com"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

获取用户

curl http://localhost:8080/users/1
  • 1.

Respons:

{
    "id": 1,
    "username": "testuser",
    "email": "test@example.com"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

查看DB

username

email

testuser

YmI4NDljOGUtOWEzNy00NWVmLWExMDMtZWMyNmFkZGM4N2NhNg==


责任编辑:武晓燕 来源: Java知识日历
相关推荐

2023-03-30 08:11:52

Spring加解密连接池

2011-03-08 11:37:26

2009-03-04 09:01:54

2021-01-07 14:17:31

Springboot数据安全加密

2011-05-19 11:00:44

数据库加密

2024-07-09 10:13:15

2011-03-02 16:43:25

2025-03-10 07:49:13

2011-03-03 13:13:51

DelphiSQLite加密

2025-02-14 09:07:35

2023-03-06 08:49:02

加密和解密SpringBoot

2024-01-02 07:04:23

2022-03-29 07:32:38

R2DBC数据库反应式

2025-03-19 08:36:55

2011-07-04 18:02:29

QT Sqlite 数据库

2018-07-25 18:40:06

数据库MySQL多字段过滤

2022-04-28 07:31:41

Springkafka数据量

2021-02-19 11:10:10

数据库

2025-03-04 08:40:28

2011-04-06 09:25:20

MySQL数据库
点赞
收藏

51CTO技术栈公众号