spring boot集成jasypt 并 实现自定义加解密

这篇具有很好参考价值的文章主要介绍了spring boot集成jasypt 并 实现自定义加解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 技术需求

由于项目中的配置文件 配置的地方过多,现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中

项目中组件使用的版本环境如下
spring cloud 2021.0.5
spring cloud alibaba 2021.0.5.0
spring boot 2.6.13

二. 技术实现

配置文件的加密使用 加密库 jasypt

三. 简单使用步骤

  • 引入maven依赖

    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
    
  • 添加配置

    #加解密使用的密码 可以理解为密钥
    jasypt.encryptor.password=12581
    
  • 使用jasypt配置的密码来加密密码 并替换配置原先密码 (提供工具类进行加密)

    #原密码
    spring.datasource.passsword=1232456
    #新的密码 其实 rngDAJwRU09A3oNLkxzNaP3wfyhHt5N4DPAjudNJKDYAWXDeFmdGcFvgZJSh4gqZ 为源密码加密后的值
    spring.datasource.password=ENC(rngDAJwRU09A3oNLkxzNaP3wfyhHt5N4DPAjudNJKDYAWXDeFmdGcFvgZJSh4gqZ)
    

工具类如下

@Slf4j
public class Custom {

    public static void main(String[] args) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
      	//TODO 替换为配置文件中的密码
        config.setPassword("12581");
      	//默认的加密算法
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
      	//TODO 123456 替换为所需加密的 原文
        String encrypt = encryptor.encrypt("123456");
        log.info("encrypt: {}", encrypt);
    }
}

到此就完成基本的配置文件加解密

你以为结束了吗,no~~~~

四. 高级使用篇

上面使用的默认的加解密的工具类,但是jasypt.encryptor.password 还是需要配置在配置文件中的 (配置文件、jvm参数等)本质来讲还是容易统一泄露。到这里,可能就有灵感了。不如我们自定义的加密的工具类 复杂的话 也可以搞个非对称加密(这个可自行研究)

目前我们来使用下 自定义加密的工具

(1)首先实现自定义的加密工具 需要实现 StringEncryptor 即可 我们这是用的国密4的对称加密算法 同时使用了 hutool的工具类

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SM4;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.jasypt.encryption.StringEncryptor;

import java.nio.charset.StandardCharsets;

/**
 * @author leon
 * @date 2023-08-19 10:54:32
 */
@Slf4j
public class Sm4Encryptor implements StringEncryptor {

    private static final SM4 SM_4;


    static {
        byte[] key = "1234567891234560".getBytes();
        byte[] iv = "1234567891234560".getBytes();
        SM_4 = new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv);
    }

    @Override
    public String encrypt(String message) {
      	return SM_4.encryptHex(message);
    }

    @Override
    public String decrypt(String encryptedMessage) {
      	return SM_4.decryptStr(encryptedMessage);
    }

    public static void main(String[] args) {
       
        String originalValue = "123456";
        String encrypted = SM_4.encryptHex(originalValue);
        String decrypted = SM_4.decryptStr(encrypted);
        log.info("Original Value: {}" , originalValue);
        log.info("Encrypted Value: {}" , encrypted);
        log.info("Decrypted Value: {}", decrypted);
    }


}

(2)注册该bean 这需要使用特殊的方式注册bean 因为我们希望在 Spring Boot 应用程序启动期间提前将自定义的加解密类添加到 Spring 的应用程序上下文中,以便在配置文件加载之前,加解密类已经可用。这样可以确保配置文件中的加密属性能够在加载时使用正确的自定义加解密逻辑进行解密

新建初始化类

import com.stlye.encryptor.Sm4Encryptor;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @date 2023-08-21 13:57:20
 * @author leon
 */
public class CustomContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        applicationContext.getBeanFactory().registerSingleton("encryptorBean", new Sm4Encryptor());
    }
}

其次在resource 下新建 META_INF文件夹 并新建 spring.factories 文件

org.springframework.context.ApplicationContextInitializer=com.style.order.config.CustomContextInitializer

(3)调整配置

#移除该配置 
jasypt.encryptor.password=12581

#新增如下配置 自定义加解密工具的bean名称 
jasypt.encryptor.bean=encryptorBean

(4) 使用该工具类生成需要加密的内容 并替换 原配置文件中的内容

#其中cab60ba208f8a7d87c4f631e2763607a为源密码加密后的内容
spring.datasource.password=ENC(cab60ba208f8a7d87c4f631e2763607a)

#另外属性解密的前缀和后缀都是支持自定义 默认如下
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)

到这里就完成配置的文件的加密 你肯定会好奇,解密需要我们自己做么,回答当然不需要,这个框架中已经自动帮我们进行了解密

具体的实现原理可看源码类 EnableEncryptablePropertiesBeanFactoryPostProcessor 和 EncryptablePropertyResolverConfiguration 两大核心类 本质上来讲也是动态代理。

以下是国密4加密算法的参数介绍


密码的加密算法选择了 SM4 国密的对称加密算法

内置参数 模式和补码方式对比如下

//不同的模式和补码方式在加密算法中有不同的作用,它们会影响加密和解密的行为以及安全性。下面我会简要解释一下不同模式和补码方式的区别,并提供一些关于安全性的信息:
//
//**模式(Mode)**:
//加密模式定义了数据块之间是如何加密的,它影响到同一消息分成多个数据块时的加密方式。以下是一些常见的加密模式:
//
//1. **ECB(Electronic Codebook)**:每个数据块都独立加密,相同的输入会得到相同的输出。不适合加密大量数据,安全性较差。
//
//2. **CBC(Cipher Block Chaining)**:前一个数据块的加密结果会与当前数据块一起进行加密。需要一个初始化向量(IV)来增加安全性。
//
//3. **CFB(Cipher Feedback)**:前一个密文块被解密并与当前明文块进行异或操作,然后再进行加密。不需要 IV。
//
//4. **OFB(Output Feedback)**:类似于 CFB,但是前一个密文块只用于生成密钥流,不直接与明文块进行操作。不需要 IV。
//
//5. **CTR(Counter)**:将 IV 与一个计数器组合,生成密钥流,然后与明文块进行异或操作。不需要 IV。
//
//**补码方式(Padding)**:
//补码方式是在加密块大小与数据大小不匹配时,如何填充数据块的方式。以下是一些常见的补码方式:
//
//1. **NoPadding**:不进行任何填充,要求明文的大小必须是加密块大小的倍数。
//
//2. **PKCS5Padding** / **PKCS7Padding**:在数据块的末尾填充字节,字节的值等于需要填充的字节数。
//
//3. **ISO10126Padding**:在数据块的末尾填充随机字节,最后一个字节指示填充的字节数。
//
//4. **ZeroBytePadding**:在数据块的末尾填充零字节。
//
//**安全性评估**:
//安全性评估涉及多个因素,包括加密算法的强度、密钥的管理、数据传输的安全性等。在选择加密模式和补码方式时,要根据具体的应用场景和安全需求进行权衡。一般而言,以下是一些建议:
//
//- **模式选择**:CBC 模式相对较为常见和安全,适用于大多数场景。CTR 也是一种常见的选择,适合并行加解密。
//
//- **补码方式选择**:PKCS7Padding / PKCS5Padding 是常见的选择,它们会根据需要填充的字节数进行填充,相对比较安全。
//
//总之,选择加密模式和补码方式时,应该综合考虑性能、安全性和适用性。在设计和实现加密系统时,最好参考专业的加密标准和最佳实践,以确保数据的安全性。

其中安全性较高 mode参数可选择值的是 CBC / GCM

在国密4(SM4)加密算法中,GCM(Galois/Counter Mode)和CBC(Cipher Block Chaining)都是加密模式,用于定义不同的加密操作方式。它们有一些区别,包括加密过程、性能、安全性等方面。

  1. GCM模式(Galois/Counter Mode):

    • GCM是一种高级的分组加密模式,除了提供加密和解密功能外,还具有认证和完整性校验的能力。
    • GCM模式在加密过程中会使用一个称为"Nonce"的值,用于确保每个加密操作的唯一性,避免重复使用Nonce导致的安全问题。
    • GCM模式可以同时进行加密和认证,因此在一些场景中可以减少通信的复杂性和性能开销。
    • 由于GCM模式的性能较高且提供了认证能力,通常在需要较高性能和安全性的场景中被使用。
  2. CBC模式(Cipher Block Chaining):

    • CBC是一种较为传统的分组加密模式,每个分组的密文会依赖于前一个分组的明文,因此具有一定的关联性。
    • CBC模式需要在加密前进行填充操作,以适应固定长度的分组大小。
    • 由于每个分组的加密都依赖于前一个分组的密文,所以在并行处理时可能存在性能上的限制。
    • CBC模式通常需要额外的认证步骤来保证数据完整性和安全性。

性能方面,GCM模式通常在处理大量数据时具有更好的性能,因为它可以同时进行加密和认证,而且不需要像CBC那样需要明确的填充步骤。然而,由于GCM模式引入了额外的认证计算,对于较小的数据块,GCM的性能可能会略逊于CBC。

选择合适的加密模式取决于具体的应用场景和需求。如果你需要高性能和认证能力,可以考虑使用GCM模式。如果你更关注传统的分组加密模式,并且不需要认证能力,可以选择CBC模式。

GCM 由于使用一个称为"Nonce"的值,每次加密都需要保证唯一 ,每次需要新建实例 ,避免重复使用Nonce导致的安全问题 这就导致了性能来讲可能稍逊于 CBC 且GCM模式 不需要补码文章来源地址https://www.toymoban.com/news/detail-672173.html

到了这里,关于spring boot集成jasypt 并 实现自定义加解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot学习随笔- Jasypt加密数据库用户名和密码以及解密

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 Jasypt 全称是Java Simplified Encryption,是一个开源项目。 Jasypt与Spring Boot集成,以便在应用程序的属性文件中加密敏感信息,然后在应用程序运行时解密这些信息。 可以使用 jasypt-spring-boot-starter 这个依赖项。从而实现属性源

    2024年02月04日
    浏览(54)
  • 如何使用Spring Cloud搭建高可用的Elasticsearch集群?详解Elasticsearch的安装与配置及Spring Boot集成的实现

    Spring Cloud 是一个基于 Spring Boot 的微服务框架,它提供了一系列组件和工具,方便开发人员快速搭建和管理分布式系统。Elasticsearch 是一个开源的全文搜索引擎,也是一个分布式、高可用的 NoSQL 数据库。本篇博客将详细讲解如何使用 Spring Cloud 搭建 Elasticsearch,并介绍如何在

    2023年04月09日
    浏览(36)
  • SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

    springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 Jasypt默认算法为PBEWithMD5AndDES,该算法需要一个加密密钥,可以在应用启动时指定(环境变量)。也可以直接写入配置文件 3.1 application.properties配置文件版 加密后,可删除jasypt.encryptor.password配置;发版时可在命令行中配置 3.2 函数

    2024年02月15日
    浏览(29)
  • Java版知识付费源码 Spring Cloud+Spring Boot 前后端分离实现知识付费平台

     提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含:录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署,免费售后,专业技术指导,支持PC、APP、H5、小程序多终端同步,支持二次开发定制,源码交付。   Java版知识付费-轻松

    2024年02月15日
    浏览(36)
  • 第十六章 : Spring Cloud集成 Spring Boot Admin的监控告警

    第十六章 : Spring Cloud集成 Spring Boot Admin的监控告警 本章知识点:本章将系统全面地介绍Spring Boot Admin组件与Nacos组件集成,重点介绍Admin监控背景、应用场景案例以及监控服务内容;监控服务内容包括服务信息、健康状态、元数据、进程、线程、垃圾回收情况、堆内存和非堆

    2024年01月25日
    浏览(30)
  • Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

    知识付费平台主要指的是能够通过付费来满足用户知识需求的平台,用户可以通过该平台来消费知识或者开展知识买卖等行为。   此处的平台是一个广义的概念,可以是微信小程序或者论坛,也可以是网页或者手机APP,等,就我国的情况而言,在知识付费平台发展初期,平台

    2024年02月16日
    浏览(44)
  • java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

     工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理    工程项目各模块及其功能点清单 一、系统管理     1、数据字典:实现对数据字典

    2024年02月07日
    浏览(36)
  • Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46

    在前面我们通过以下章节对 ShardingSphere 的 AutoTable 有了基础的了解: Spring Boot集成ShardingSphere分片利器 AutoTable (一)—— 简单体验 | Spring Cloud 45 书接上回,本章进行对 AutoTable 支持的自动分片算法进行逐一示例说明。 示例采用 springboot 集成 shardingsphere-jdbc 方式搭建。 shadi

    2024年02月10日
    浏览(30)
  • Spring Boot学习随笔- 集成MyBatis-Plus(三)自定义SQL、分页实现(PaginationInterceptor )、更新和删除详细方法

    学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 自定义mapper文件是为了应对一些更复杂的查询场景,首先先配置映射路径 由于这里的mapper文件放在java文件夹中,所以要在pom.xml里进行配置 mapper 测试 在MyBatis Plus中, 物理分页 和 内

    2024年02月03日
    浏览(45)
  • spring项目本地配置及nacos远端配置的解密(不依赖jasypt框架)

    locator:NacosDecryptPropertySourceLocator.java 继承NacosPropertySourceLocator并重写locate方法,在nacos自身的热更新配置置入propertySources前将解密后的propertySource放入spring更新environment的队列(spring在更新environment时遇到同名的propertySource会优先选择更早放入的,所以本功能为@Order(-1),在正常的

    2024年02月14日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包