SpringBoot使用Jasypt对配置文件和数据库密码加密

 更新时间:2024年02月28日 09:57:04   作者:skywsp  
在做数据库敏感信息保护时,应加密存储,本文就来介绍一下SpringBoot使用Jasypt对配置文件和数据库密码加密,具有一定的参考价值,感兴趣的可以了解一下

在做数据库敏感信息保护时,Web应用配置的账号密码,在配置文件应加密存储,禁止使用明文账号密码,这时我们可以使用Jasypt加密来实现需求。

一、Jasypt简介

Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。

1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。

2、在程序界有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中使用特定格式直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。

1)Jasypt 加密属性配置格式:

spring:
  datasource:
    password: ENC(o6L5p3ymfSMiscyR9CPio4NfGPg+W9==)

ENC() 就是它的标识,程序启动的时候,会自动解密其中的内容,如果解密失败,则会报错。
2)所以获取这些属性值和平时没有区别,直接使用如 @Value(“${spring.datasource.password}”) 获取即可,取值并不需要特殊处理。

3、jasypt 同一个密钥(secretKey)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的.

4、Jasypt 官方使用文档:http://www.jasypt.org/
GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot。

二、集成方法

官网上推荐的集成到SpringBoot项目中,有3种方法分别是:

  • 如果使用@SpringBootApplication或@EnableAutoConfiguration,则仅需要添加jasypt-spring-boot-starter启动器jar到您的类路径中即可,它自动会在整个 Spring 环境中启用可加密属性。
  • 添加jasypt-spring-boot到您的类路径并添加@EnableEncryptableProperties到您的主配置类以在整个 Spring 环境中启用可加密属性。
  • 添加jasypt-spring-boot到您的类路径并使用@EncrytablePropertySource注解声明单独的可加密属性源。

2.1 方式一

在Springboot应用程序中,如果使用了@SpringBootApplication 或者@EnableAutoConfiguration注解,则可以在pom文件中添加jasypt-spring-boot-starter依赖,然后就可以在整个Spring环境中使用jasypt对属性进行加解密操作(属性包括:系统属性、环境属性、命令行参数、application.properties、application-*.properties、yml属性以及任何其他属性源)。

<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot-starter</artifactId>
    <!-- JDK9+用3.x版本,JDK8用2.x版本 -->
    <!-- 仓库:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ -->
	<version>2.1.2</version>
</dependency>

2.2 方式二

如果项目中没有使用到@SpringBootApplication 或者@EnableAutoConfiguration 自动配置注解,则可以通过以下两个步骤完成对Jasypt的集成。

步骤一:pom文件引入jasypt-spring-boot依赖

<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot</artifactId>
    <!-- JDK9+用3.x版本,JDK8用2.x版本 -->
    <!-- 仓库:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ -->
	<version>2.1.2</version>
</dependency>

步骤二:在配置类中,添加@EnableEncryptableProperties注解,示例如下:

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;

@SpringBootApplication
@EnableEncryptableProperties
public class MySpringBootApp {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApp.class, args);
    }
}

通过这种方式,你的项目一样可以集成Jasypt,并且可加密属性也可以在整个Spring环境中启用属性包括:系统属性、环境属性、命令行参数、application.properties、application-*.properties、yml属性以及任何其他属性源)。

2.3 方式三

如果项目中没有使用到@SpringBootApplication 或者@EnableAutoConfiguration 自动配置注解,又不想在整个Spring环境中启用加密的属性,则可以使用该种方式,具体步骤如下:

步骤一:pom文件引入jasypt-spring-boot依赖

<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot</artifactId>
    <!-- JDK9+用3.x版本,JDK8用2.x版本 -->
    <!-- 仓库:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ -->
	<version>2.1.2</version>
</dependency>

步骤二、在配置类中,使用@EncryptablePropertySource注解添加任意数量想要生效加密属性的配置文件路径,与Spring中@PropertySource注解的使用类似,示例如下:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
    ...
}

同时,还可以使用@EncryptablePropertySources 注解对@EncryptablePropertySource配置进行分组,示例如下:

@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),
                             @EncryptablePropertySource("classpath:encrypted2.properties")})
public class MyApplication {
    ...
}

说明:从Jasypt 1.8版本开始,@EncryptablePropertySource注解支持配置YAML文件。

三、Springboot整合Jasypt实战

Dmo源码请点这里!

3.1 引入依赖

本Demo使用JDK8,所有依赖2.1.2版本

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3.2 准备加密后的数据

    @Test
    public void test() {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();

        // 加密秘钥(盐值)
        textEncryptor.setPassword("jasyptSalt123");

        // 对账号加密
        String encUsername = textEncryptor.encrypt("zhangsan");
        System.out.println(encUsername);

        // 对密码加密
        String encPassword = textEncryptor.encrypt("abc123@test");
        System.out.println(encPassword);
    }

3.3 配置文件使用加密数据

spring:
  datasource:
    # 明文账号密码
    username: zhangsan
    password: abc123@test

    # 加密后的账号密码
    encUsername: ENC(CsXfWspTjwzJ99zeeXhNAk7Jk0/XbeTp)
    encPassword: ENC(SZqTzbJYCOCErUYWDHdSrXC1Mb/wNYSB)

# jasypt加密秘钥,需要从配置文件中删除,改为在项目启动命令上配置环境参数
jasypt:
  encryptor:
    password: jasyptSalt123

3.4 直接获取解密数据

@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class SamProperties {
    private String username;
    private String password;

    // 配置注入前会自动解密
    private String encUsername;
    private String encPassword;
}

四、拓展

4.1 关于加解密秘钥如何存储

如果秘钥写在代码或者配置文件,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,这样对敏感信息加密的作用就不存在了,因此,秘钥不能以明文形式存储在代码或者配置文件中,应该在应用部署时通过变量传入。

java -Djasypt.encryptor.password=秘钥 -jar xxx.jar

或:

java -jar xxx.jar --jasypt.encryptor.password=秘钥

4.2 使用jasypt3.0启动时报

使用jasypt3.0启动时报:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String

官方描述,3.0后默认支持的算法为PBEWITHHMACSHA512ANDAES_256 ,该种加密方式由sha512 加 AES 高级加密组成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension无限强度权限策略文件)支持,否则运行会出现错误。

4.2.1 解决方案1,降低版本
降低jasypt的版本 - 使用2.x的版本

4.2.2 解决方案2,修改算法
将加密算法替换成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 为org.jasypt.iv.NoIvGenerator值

到此这篇关于SpringBoot使用Jasypt对配置文件和数据库密码加密的文章就介绍到这了,更多相关SpringBoot Jasypt加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Mybatis-Plus拦截器实现MySQL数据加解密的示例代码

    基于Mybatis-Plus拦截器实现MySQL数据加解密的示例代码

    用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密,解密等功能,接下来本文就给大家介绍基于Mybatis-Plus拦截器实现MySQL数据加解密,需要的朋友可以参考下
    2023-07-07
  • java模式匹配之蛮力匹配

    java模式匹配之蛮力匹配

    这篇文章主要介绍了java模式匹配之蛮力匹配的相关资料和代码,需要的朋友可以参考下
    2015-05-05
  • SSM项目中使用拦截器和过滤器的实现示例

    SSM项目中使用拦截器和过滤器的实现示例

    这篇文章主要介绍了SSM项目中使用拦截器和过滤器的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java 时间日期详细介绍及实例

    Java 时间日期详细介绍及实例

    这篇文章主要介绍了Java 时间日期详细介绍及实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 浅谈Java反射与代理

    浅谈Java反射与代理

    下面小编就为大家带来一篇浅谈Java反射与代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Spring Data JPA+kkpager实现分页功能实例

    Spring Data JPA+kkpager实现分页功能实例

    本篇文章主要介绍了Spring Data JPA+kkpager实现分页功能实例,具有一定的参考价值,有兴趣的可以了解一下
    2017-06-06
  • Java lambda表达式与泛型整理总结

    Java lambda表达式与泛型整理总结

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名。泛型编程,故如其名,是一个泛化的编程方式。其实现原理为程序员编写一个函数/类的代码示例,让编译器去填补出不同的函数实现
    2022-07-07
  • 详解SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)

    详解SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba J

    这篇文章主要介绍了SpringBoot的三种缓存技术,帮助大家更好的理解和学习springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • java:程序包org.bouncycastle.jce.provider不存在问题及解决

    java:程序包org.bouncycastle.jce.provider不存在问题及解决

    这篇文章主要介绍了java:程序包org.bouncycastle.jce.provider不存在问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spring Security十分钟入门教程

    Spring Security十分钟入门教程

    这篇文章主要介绍了Spring Security入门教程,Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
    2022-09-09

最新评论