当前位置:   article > 正文

springboot项目配置属性通过jasypt加密明文_springboot数据库密码配置加密

springboot数据库密码配置加密

springboot项目配置属性如何通过jasypt加密明文

项目中经常会用到数据库,需要配置账号、密码登信息,由于这些信息都比较敏感,为了防止直接配置明文导致泄密风险,故通常是对密码明文进行加密处理,以下介绍jasypt对明文进行加密处理。

Jasypt简介

Jasypt Spring Boot 为 Spring Boot 应用程序中的属性源提供加密支持。有 3 种方法可以将 jasypt-spring-boot 集成到您的项目中:
  • 1

如果使用 @SpringBootApplication 或 @EnableAutoConfiguration,只需将启动器 jar jasypt-spring-boot-starter 添加到您的类路径中即可在整个 Spring 环境中启用可加密属性 。
添加 jasypt-spring -boot 到您的类路径,并将 @EnableEncryptableProperties 添加到您的主配置类,以在整个 Spring 环境中启用可加密属性 。
将 jasypt-spring-boot 添加到您的类路径,并使用 @EncrytablePropertySource 声明各个可加密属性源。
官网:https://github.com/ulisesbocchio/jasypt-spring-boot

Jasypt官网

官网:https://github.com/ulisesbocchio/jasypt-spring-boot
在这里插入图片描述

Jasypt使用-方式一

如果是 Spring Boot 应用程序,使用了注解 @SpringBootApplication 或者 @EnableAutoConfiguration,那么只需添加 jasypt-spring-boot-starter 依赖,此时整个 Spring 环境就会支持可加密属性配置(这意味着任何系统属性、环境属性、命令行参数,yaml、properties 和任何其他自定义属性源可以包含加密属性):

com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.5

Jasypt使用-方式二

如果您不使用 @SpringBootApplication 或 @EnableAutoConfiguration 自动配置注释,则将此依赖项添加到您的项目中:

<dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot</artifactId>
        <version>3.0.5</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

然后将 @EnableEncryptableProperties 添加到配置类中,以便在整个 Spring 环境中启用可加密属性:

@Configuration
@EnableEncryptableProperties
public class MyApplication {
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5

Jasypt使用-方式三

如果您不使用 @SpringBootApplication 或 @EnableAutoConfiguration 自动配置注释,并且您不想在整个 Spring 环境中启用可加密属性,那么还有第三种选择。首先将以下依赖项添加到您的项目中:

<dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot</artifactId>
        <version>3.0.5</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

然后在配置文件中添加任意数量的 @EncryptablePropertySource 注解,就像使用 Spring 的 @PropertySource 注解一样:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5

或者还可以使用 @EncryptablePropertySources 注解来对 @EncryptablePropertySource 类型的注解进行分组:

@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),
                             @EncryptablePropertySource("classpath:encrypted2.properties")})
public class MyApplication {
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意,从版本 1.8 开始,@EncryptablePropertySource 支持 YAML 文件。

Jasypt-加密配置属性

在这里插入图片描述
唯一需要的属性是加密密码,其余的可以保留使用默认值。虽然所有这些属性都可以在属性文件中声明,但加密器密码不应存储在属性文件中,而应作为系统属性、命令行参数或环境变量传递,并且只要其名称为 jasypt.encryptor .password 就可以了。
最后一个属性 jasypt.encryptor.proxyPropertySources 用于指示 jasyp-spring-boot 如何拦截属性值以进行解密。默认值 false 使用 PropertySource、EnumerablePropertySource 和 MapPropertySource 的自定义包装器实现。当为此属性指定 true 时,拦截机制将在每个特定 PropertySource 实现上使用 CGLib 代理。这在某些必须保留原始 PropertySource 类型的场景中可能很有用。

加密属性类com.ulisesbocchio.jasyptspringboot.properties.JasyptEncryptorConfigurationProperties
在这里插入图片描述
加密属性查看:D:\maven-repository\com\github\ulisesbocchio\jasypt-spring-boot\3.0.3\jasypt-spring-boot-3.0.3.jar!\META-INF\spring-configuration-metadata.json。
在这里插入图片描述

Jasypt-自定义加密器

对于加密器的自定义配置和加密器密码的来源,您始终可以在 Spring 上下文中定义自己的 StringEncryptor bean,并且默认的加密器将被忽略。例如:

@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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

请注意,bean 名称是必需的,因为 jasypt-spring-boot 从版本 1.5 开始按名称检测自定义字符串加密器。默认的 bean 名称是:jasyptStringEncryptor。但也可以通过定义属性来覆盖这一点:jasypt.encryptor.bean
例如,如果您定义 jasypt.encryptor.bean=encryptorBean 那么您将使用该名称定义自定义加密器:

@Bean("encryptorBean")
    public StringEncryptor stringEncryptor() {
        ...
    }
  • 1
  • 2
  • 3
  • 4

Jasypt-自定义加密属性前缀和后缀

如果您只想为加密属性使用不同的前缀/后缀,则可以继续使用所有默认实现,只需覆盖 application.properties (或 application.yml)中的以下属性:

jasypt:
  encryptor:
    property:
      prefix: "ENC@["
      suffix: "]"
  • 1
  • 2
  • 3
  • 4
  • 5

springboot项目中jasypt应用

在pom.xml文件引入依赖包

        <!-- jasypt加密-->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

application属性文件增加jasypt配置

# jasypt加密秘钥,生产环境建议在项目启动时,通过命令配置环境参数,防止密码泄露风险
jasypt:
  encryptor:
#    加密算法,默认使用 PBEWithMD5AndDES
    algorithm: PBEWithHMACSHA512AndAES_256
#    加密盐值
    password: 6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9
    # 3.0.0版本及以上版本需要添加如下配置
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过jasypt加密明文

package com.starsky;

import org.jasypt.util.text.AES256TextEncryptor;
import org.jasypt.util.text.BasicTextEncryptor;
import org.jasypt.util.text.StrongTextEncryptor;

/**
 * jasypt加解密
 */
public class JasyptPasswordTest {

    public static void main(String[] args) {
        //默认使用加密算法:PBEWithMD5AndDES
        basicTextEncryptor();
        //默认使用加密算法:PBEWithHMACSHA512AndAES_256
        aES256TextEncryptor();
    }

    /**
     * AES256TextEncryptor加解密,默认使用加密算法:PBEWithHMACSHA512AndAES_256
     */
    public static void strongTextEncryptor() {
        //默认使用加密算法:PBEWithMD5AndTripleDES
        StrongTextEncryptor textEncryptor = new StrongTextEncryptor();
        // 加密秘钥(盐值)
        textEncryptor.setPassword("6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9");
        // 对账号加密
        String encUsername = textEncryptor.encrypt("root");
        System.out.println("加密结果:" + encUsername);

        final String decrypt = textEncryptor.decrypt("eoxcn/Mt11DeqXtGGlHFo29");
        System.out.println("解密结果:" + decrypt);
    }

    /**
     * AES256TextEncryptor加解密,默认使用加密算法:PBEWithHMACSHA512AndAES_256
     */
    public static void aES256TextEncryptor() {
        //默认使用加密算法:PBEWithHMACSHA512AndAES_256
        AES256TextEncryptor textEncryptor = new AES256TextEncryptor();
        // 加密秘钥(盐值)
        textEncryptor.setPassword("6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9");
        // 对账号加密
        String encUsername = textEncryptor.encrypt("root");
        System.out.println("加密结果:" + encUsername);

        final String decrypt = textEncryptor.decrypt("eoxcn/Mt11DeqXtGGlHFo29");
        System.out.println("解密结果:" + decrypt);
    }

    /**
     * BasicTextEncryptor加解密,默认使用加密算法:PBEWithMD5AndDES
     */
    public static void basicTextEncryptor() {
        //默认使用加密算法:PBEWithMD5AndDES
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        // 加密秘钥(盐值)
        textEncryptor.setPassword("6Sd96w7Bl8rS3KztOBEJ9jXmlokeOerQGs9");
        // 对账号加密
        String encUsername = textEncryptor.encrypt("root");
        System.out.println("加密结果:" + encUsername);
        final String decrypt = textEncryptor.decrypt("eoxcn/Mt11DeqXtGGlHFo");
        System.out.println("解密结果:" + decrypt);
    }

}


  • 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
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

application属性文件加密数据库用户名及密码

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://localhost:3306/ruoyi-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: ENC(eoxcn/Mt11DeqXtGGlHFo29hzN3xjrklVHrHE8ZjA4XulldZ/8R4C93lgoWnzb23)
        password: ENC(eoxcn/Mt11DeqXtGGlHFo29hzN3xjrklVHrHE8ZjA4XulldZ/8R4C93lgoWnzb23)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

启动服务测试验证

在这里插入图片描述
可以看到服务已经启动成功,数据库连接数据库正常,在测试接口查询数据库验证。

访问swagger验证:
http://localhost:9999/tbs/swagger-ui.html
在这里插入图片描述

选择数据字典控制器查询数据库接口测试加密后的数据密码是否生效。
在这里插入图片描述
在这里插入图片描述
可以看到查询数据库成功,以上表示数据库加密成功。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/945687
推荐阅读
相关标签
  

闽ICP备14008679号