SpringBoot+ENC实现密钥加密的使用示例

 更新时间:2024年07月29日 09:40:39   作者:一恍过去  
本文主要介绍了SpringBoot+ENC实现密钥加密的使用示例,主要是为了将配置信息从应用程序代码中分离出来,以提高安全性和可维护性,感兴趣的可以了解一下

前言

Spring Boot中使用ENC(Environment-Neutral Configuration)主要是为了将配置信息从应用程序代码中分离出来,以提高安全性和可维护性。ENC的主要优点包括:

  • 安全性增强: 敏感信息(如数据库密码、API密钥等)不应硬编码在代码中,而是应该使用加密的方式存储在配置文件中,然后通过ENC进行解密和使用,从而减少泄露风险。
  • 可维护性: 将配置信息与代码分离,使得配置可以独立地修改和管理,而不需要重新编译和部署应用程序。这样可以降低维护成本,并使应用程序更易于管理。
  • 灵活性: 使用ENC可以根据不同的环境(开发、测试、生产等)提供不同的配置,而不需要修改应用程序代码,从而提高了部署的灵活性和可移植性。

1、整合SpringBoot

1.1、POM

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

1.2、加密盐值配置

整合SpringBoot时,盐值的配置最好式写到配置中心的文件中,盐值写到本地文件,泄露后也容易被进行解密

jasypt:
  encryptor:
  	# password值任意,最好随机字符
    password: hhX4FzbwcT

1.3、工具类使用

使用工具类对需要处理的明文数据进行加密处理,再将加密结果写入到配置文件中

注意:工具类使用完成后,应该删除加密盐

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

public class JasyptTest {

    /**
     * 加密盐值,使用完成后进行删除,或者不能提交到`生产环境`,比如:
     */
    private final static String PASSWORD = "hhX4FzbwcT";


    public static void main(String[] args) {

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        // 用于设置加密密钥。密钥是用于加密和解密字符串的关键信息。
        config.setPassword(PASSWORD);
        // 加密算法的名称,jasypt-3.0.5版本后默认的加密方式
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        // 用于设置加密时迭代次数的数量,增加迭代次数可以使攻击者更难进行密码破解。
        config.setKeyObtentionIterations("1000");
        // 加密器池的大小。池是一组加密器实例,可确保加密操作的并发性。
        config.setPoolSize("1");
        // 用于设置JCE(Java Cryptography Extension)提供程序的名称。
        config.setProviderName("SunJCE");
        // 用于设置生成盐的类名称。在此配置中,我们使用了org.jasypt.salt.RandomSaltGenerator,表示使用随机生成的盐。
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        // 用于设置Jasypt使用的初始化向量(IV)生成器的类名。初始化向量是在加密过程中使用的一个固定长度的随机数,用于加密数据块,使每个数据块的加密结果都是唯一的。在此配置中,我们使用了org.jasypt.iv.RandomIvGenerator类,该类是一个随机生成器,用于生成实时随机IV的实例。这样可以确保每次加密的IV都是唯一的,从而增加加密强度。
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        // 指定加密输出类型。在此配置中,我们选择了base64输出类型。
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        // 明文1
        String name_encrypt = "root";
        // 明文2
        String password_encrypt = "123456";

        // 明文加密
        String encrypt1 = encryptor.encrypt(name_encrypt);
        String encrypt2 = encryptor.encrypt(password_encrypt);
        System.out.println("明文加密1:" + encrypt1);
        System.out.println("明文加密2:" + encrypt2);

        // 密文解密
        String decrypt1 = encryptor.decrypt(encrypt1);
        String decrypt2 = encryptor.decrypt(encrypt2);
        System.out.println("密文解密1:" + decrypt1);
        System.out.println("密文解密2:" + decrypt2);
    }
}

在这里插入图片描述

1.4、加密配置使用

YAML:

sys:
 name: ENC(Yt36hceu3xGXEzrz2jCPjvalaXQ5yIHE04SVT6lIkcktrxqtBZrlivkAkA9/9oZ2)
 password: ENC(0Ci6irPOko9IG+hBZJAGoguIuE52gF/XiigCV4DwLm6NfkoyvV4Etgc9FzKK3MYl)

1.5、测试

项目成功启动,Yaml中设置密文文本,Controller正常打印明文信息,就表示ENC配置成功了

@RestController
public class TestController {

    @Value("${sys.name}")
    private String name;

    @Value("${sys.password}")
    private String password;

    @GetMapping("/test")
    public void test() {
        System.out.println("name = " + name);
        System.out.println("password = " + password);
    }
}

2、ENC加载原理

1、在jasypt-spring-boot-starter包的自动配置类JasyptSpringBootAutoConfiguration中通过@Import注解引入了EnableEncryptablePropertiesConfiguration配置类,该类中environment参数储存了yaml文件元数据;

2、在postProcessBeanFactory方法中,调用environment.getPropertySources()方法获取yaml配置项目;

在这里插入图片描述

3、通过convertPropertySources进行数据转换,修改yaml中配置项值,具体实现为调用instantiatePropertySource()方法,在该方法中,匹配propertySource instanceof MapPropertySource,转化为EncryptableMapPropertySourceWrapper对象;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、EncryptableMapPropertySourceWapper类中,通过getProperty(name)方法进行匹配,匹配成功后调用resolver.resolvePropertyValue进行ENC配置的解密并且替换原有的propertySource值;

在这里插入图片描述

到此这篇关于SpringBoot+ENC实现密钥加密的使用示例的文章就介绍到这了,更多相关SpringBoot ENC密钥加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java二叉树的遍历思想及核心代码实现

    Java二叉树的遍历思想及核心代码实现

    今天小编就为大家分享一篇关于Java二叉树的遍历思想及核心代码实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java中Calendar类的一些常用方法小结

    Java中Calendar类的一些常用方法小结

    项目当中,我们经常会涉及到对时间的处理,Date类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但更推荐使用 Calendar 类进行时间和日期的处理,这篇文章主要给大家介绍了关于Java中Calendar类的一些常用方法,需要的朋友可以参考下
    2021-11-11
  • 关于springboot打包目录全解析

    关于springboot打包目录全解析

    这篇文章主要介绍了springboot打包目录解析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java案例使用集合方法实现统计任意字符串中字符出现的次数

    Java案例使用集合方法实现统计任意字符串中字符出现的次数

    这篇文章主要介绍了Java案例使用集合方法实现统计任意字符串中字符出现的次数,下面我们将用两种方法实现,需要的小伙伴可以参考一下文章具体内容
    2022-04-04
  • JavaWeb踩坑记录之项目访问不到html文件

    JavaWeb踩坑记录之项目访问不到html文件

    这篇文章主要给大家介绍了关于JavaWeb踩坑记录之项目访问不到html文件的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用JavaWeb具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Springboot通过配置WebMvcConfig处理Cors非同源访问跨域问题

    Springboot通过配置WebMvcConfig处理Cors非同源访问跨域问题

    这篇文章主要介绍了Springboot通过配置WebMvcConfig处理Cors非同源访问跨域问题,关于Cors跨域的问题,前端有代理和jsonp的常用方式解决这种非同源的访问拒绝策略
    2023-04-04
  • spring结合hibernate示例详解

    spring结合hibernate示例详解

    这篇文章主要介绍了spring结合hibernate结合,需要的朋友可以参考下
    2017-09-09
  • java 多线程与并发之volatile详解分析

    java 多线程与并发之volatile详解分析

    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机
    2021-11-11
  • java实现上传图片并压缩图片大小功能

    java实现上传图片并压缩图片大小功能

    这篇文章主要为大家详细介绍了java实现上传图片并压缩图片大小功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 探讨Java中函数是值传递还是引用传递问题

    探讨Java中函数是值传递还是引用传递问题

    这篇文章主要介绍了探讨Java中函数是值传递还是引用传递问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02

最新评论