开发者

SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密

目录
  • 1、前言
  • 2、什么是Jasypt
  • 3、什么是Jasypt-Spring-Boot
  • 4、接入初体验
    • 4.1 yml配置方式
    • 4.2 自定义配置类方式
    • 4.3 开始测试
    • 4.4 修改mysql参数加密
  • 5、使用JVM启动参数设置密钥
    • 6、加密和解密数据库字段
      • 7、结语

        1、前言

        在我们日常开发中,很多时候为了保证数据的安全,在处理敏感数据、前后端数据传输、数据库敏感数据入库等,数据的加密和解密是不可忽视的重要环节,特别是一些政企项目这点就尤为重要,避免每一次安全审计后反复的调整,所以在系统设计之初我们就应当把数据安全的问题考虑进去!

        今天博主就给大家详细介绍Jasypt-Spring-Boot的功能,并展示如何在Spring Boot项目中实现各种加解密操作

        2、什么是Jasypt

        Jasypt(Java Simplified Encryption)是一个用于加密和解密数据的Java库。它提供了简单易用的API,可以轻松地将加密功能集成到Java应用程序中。Jasypt支持多种加密算法,并且可以保护各种类型的数据,包括文js本、配置文件和数据库字段等。

        3、什么是Jasypt-Spring-Boot

        Jasypt-Spring-Boot是一个用于在Spring Boot应用程序中集成Jasypt的Starter。通过使用Jasypt-Spring-Boot,我们可以轻松地在Spring Boot项目中配置和使用Jasypt的加解密功能。

        目前该库已经有2.8K的Star,且目前最新版本是 3.0.5

        SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密

        github地址:https://github.com/ulisesbocchio/jasypt-spring-boot

        4、接入初体验

        在开始接入前首先构建我们的 Spring Boot 项目, 引入相关依赖

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

        4.1 yml配置方式

        修改 Spring Boot 配置文件,增加密钥

        jasypt:
            encryptor:
                password: 123456
        

        Spring Boot 启动类上 或配置类Configuration类上追加 @EnableEncryptableProperties注解

        具体参数说明可以查看以下表格

        配置项必填默认值说明
        jasypt.encryptor.password设置密钥
        jasypt.encryptor.algorithmPBEWITHHMACSHA512ANDAES_256设置算法
        jasypt.encryptor.key-obtention-iterations1000设置密钥生成的迭代次数
        jasypt.encryptor.pool-size1设置加密池的大小
        jasypt.encryptor.provider-nameSunJCE设置加密提供者名称
        jasypt.encryptor.provider-class-namenull设置加密提供类名
        jasypt.encryptor.salt-generator-classnameorg.jasypt.salt.RandomSaltGenerator设置盐值生成器的类名
        jasypt.encryptor.iv-generator-classnameorg.jasypt.iv.RandomIvGenerator设置初始化向量生成器的类名
        jasypt.encryptor.string-output-typebase64设置输出字符串的编码方式
        jasypt.encryptor.proxy-property-sourcesfalse
        jasypt.encryptor.skip-property-sourcesempty list

        最后一个属性jasypt.encryptor.proxy-property-sources用于指示jasyp-sjspring-boot如何拦截属性值以进行解密

        • 默认值false使用PropertySourceEnumerablePropertySourceMapPropertySource的自定义包装器实现。
        • 当为该属性指定true时,拦截机制将在每个特定的PropertySource实现上使用CGLib代理。这在某些必须保留原始PropertySource类型的场景中可能很有用

        4.2 自定义配置类方式

        创建一个自定义配置类:Bean名称为: jasyptStringEncryptor

        import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
        import org.jasypt.encryption.StringEncryptor;
        import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
        import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        
        @Configuration
        @EnableEncryptableProperties
        public class StringEncryptorConfig {
            @Bean("jasyptStringEncryptor")
            public StringEncryptor stringEncryptor() {
                PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
                SimpleStringPBEConfig config = new SimpleStringPBEConfig();
                config.setPassword("password");
                config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
                config.setKeyObtentionIterations("1000");
                config.setPoolSize("1");
                config.setProviderName("SunJCE");
                config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
                config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
                config.setStringOutputType("base64");
                encryptor.setConfig(config);
                return encryptor;
            }
        }
        

        温馨提示

        • 在自定义StringEncryptor的时候,会覆盖默认的加密器,且Bean名称固定为 jasyptStringEncryptor
        • 如果你需要自定义Bean名称,则需要在springboot配置文件追加

          jasypt.encryptor.bean = your encryptorBean Name

        如下面自定义自定义Bean名称

            @Bean("encryptorBean")
            public StringEncryptor stringEncryptor() {android
            	//参考上面的配置参数
                ...
            }
        

        4.3 开始测试

        我们现在来编写一个测试类,来体验加解密的效果

        	@Resource(name = "jasyptStringEncryptor")
            private StringEncryptor stringEncryptor;
        
            @Test
            public void testJasypt() {
                String mysqlRoot = stringEncryptor.encrypt("root");
                String mysqlPassword = stringEncryptor.encrypt("123456");
                System.out.println("mysqlroot加密后:"+mysqlRoot);
                System.out.println("mysqlPassword加密后:"+mysqlPassword);
                System.out.println("===================");
                System.out.println("mysqlRoot解密后:"+ stringEncryptor.decrypt(mysqlRoot));
                System.out.println("mysqlPassword解密后:"+ stringEncryptor.decrypt(mysqlPassword));
            }
        

        测试输出如下:

        SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密

        4.4 修改mysql参数加密

        我们已经获得了mysql加密后的账号以及密码,现在我们来给mysql配置的明文账户密码改一下

        加密格式:默认的前后缀是 ENC() 括号里是密文

        # 数据源配置
        spring:
            #数据源配置
            datasource:
                type: com.alibaba.druid.pool.DruidDataSource
                driverClassName: com.mysql.cj.jdbc.Driver
                druid:
                    url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                    # 未加密前
                    #username: root
                    #password: 123456
                    # 加密后
                    username: ENC(TBTl1fiJ7tilJ91sEdym6G8vEQG7Wn3QhIBU77mrfzCtqkHPMEMAihvpjokqUgMP)
                    password: ENC(9galEBTwYzgGG6ER3oY+k45463tkvYSnt+epH8SE/hldbi13hg3+XL7CPKpgJAQp)
        

        启动SpringBoot项目。观察控制台输出,数据库是否完成连接初始化,且项目启动成功!

        SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密

        特别说明

        小伙伴发现了在mysql的配置中,我们使用 ENC() 来包裹我们的密文,这个前后缀是可以修改的,如MICRO()

        修改配置文件方式

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

        编码方式

        我们可以通过创建一个名为 encryptablePropertyDetector 类型为 EncryptablePropertyDetector 的Bean来覆盖默认实现,如果你需要修改默认名称,需要覆盖属性 jasypt.encryptor.property.detector-bean 并指定您希望给予bean的名称

        private static class MyEncryptablePropertyDetector imple编程ments EncryptablePropertyDetector {
            @Override
            public boolean isEncrypted(String value) {
                if (value != null) {
                    return value.startsWith("MICRO");
                }
                return false;
            }
            @Override
            public String unwrapEncryptedValue(String value) {
                return value.substring("MICRO".length());
            }
        }
        
        @Bean(name = "encryptablePropertyDetector")
            public EncryptablePropertyDetector encryptablePropertyDetector() {
                return new MyEncryptablePropertyDetector();
            }
        

        5、使用JVM启动参数设置密钥

        在我们 YML 配置方式中, jasypt.encryptor.password=123456 是明文的,有小伙伴会问,哎呀这不也是暴露了加密密钥么? 要解决这个问题,我们可以使用JVM启动参数设置

        在IDEA项目里 ,点击 Edit Configurations ,添加 VM 启动参数 -Djasypt.encryptor.password=123456

        SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密

        SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密

        在生产环境部署jar包的时候,可以使用如下命令启动:

        java -jar your-project.jar --jasypt.encryptor.password=password
        

        6、加密和解密数据库字段

        在我们公司某些项目中,用户的敏感信息是不允许明文存储数据库的,比如手机号、身份证等,接下来我们来演示如何在实体类中使用Jasypt进行数据库字段实现加解密

        注意引入JPA支持 spring-boot-starter-data-jpa

        import javax.persistence.AttributeConverte编程客栈r;
        import javax.persistence.Converter;
        import org.jasypt.util.text.AES256TextEncryptor;
        
        @Component
        @Converter
        public class EncryptedStringConverter implements AttributeConverter<String, String> {
        
            @Resource(name = "jasyptStringEncryptor")
            private StringEncryptor stringEncryptor;
        
            @Override
            public String convertToDatabaseColumn(String attribute) {
                return stringEncryptor.encrypt(attribute);
            }
        
            @Override
            public String convertToEntityAttribute(String dbData) {
                return stringEncryptor.decrypt(dbData);
            }
        }
        

        然后在实体类中使用这个转换器

        import javax.persistence.Column;
        import javax.persistence.Convert;
        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;
        
            @Convert(converter = EncryptedStringConverter.class)
            @Column(name = "password")
            private String password;
        
            // Getters and Setters
        }
        

        7、结语

        Jasypt-Spring-Boot是一个强大且易于使用的工具,可以在Spring Boot应用程序中实现加密和解密操作。通过本文的介绍,我们了解了如何在Spring Boot项目中配置和使用Jasypt,并展示了各种加解密操作的实现方法。

        以上就是SpringBoot整合Jasypt实现配置文件和数据库字段敏感数据的加解密的详细内容,更多关于SpringBoot Jasypt加解密的资料请关注编程客栈(www.devze.com)其它相关文章!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜