SpringBoot3使用Jasypt加密数据库用户名、密码等敏感信息

 更新时间:2024年07月05日 10:34:07   作者:顽石九变  
使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以下是详细的使用说明,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

一、使用步骤介绍

使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。以下是详细的使用说明:

1. 引入依赖

首先,你需要在你的项目中引入Jasypt的依赖。如果你是使用Maven构建项目,可以在pom.xml文件中添加如下依赖(注意版本号可能随时间更新,请参考最新版本):

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

可根据需要替换成最新的版本号。

2. 配置加密密码

Jasypt需要一个密码来进行加密和解密操作。你可以通过以下几种方式配置这个密码:

在配置文件中指定:在你的application.propertiesapplication.yml配置文件中,添加jasypt.encryptor.password配置项,并设置你的密码。例如:

# application.properties
jasypt.encryptor.password=your_encryption_password

或者,在application.yml中:

jasypt:
  encryptor:
    password: your_encryption_password
  • 然而,将密码直接写在配置文件中可能存在安全风险。因此,更推荐的做法是通过启动参数或环境变量来传递这个密码。

  • 通过启动参数指定:在启动应用程序时,可以通过-Djasypt.encryptor.password=your_encryption_password参数来指定加密密码。

  • 使用环境变量:在某些情况下,使用环境变量来存储敏感信息(如加密密码)可能更为安全。具体方法取决于你的应用程序部署环境。

3. 加密敏感信息

在配置加密密码后,你可以使用Jasypt提供的工具或API来加密你的敏感信息。加密后的信息将以密文形式存储。

  • 使用Jasypt CLI工具:Jasypt提供了一个命令行界面(CLI)工具,允许你在命令行中加密和解密字符串。你需要下载Jasypt的jar包,并在命令行中运行相应的命令。

  • 使用Jasypt API:在你的Java应用程序中,你可以通过注入StringEncryptor接口的实现类来编程方式加密和解密字符串。这通常在你的Spring Boot应用程序中通过自动装配完成。

4. 将加密信息存储到配置文件中

加密敏感信息后,你需要将这些加密后的信息存储到配置文件中。在Jasypt中,加密后的信息通常以ENC(...)的形式出现,括号内是加密后的密文。例如:

# application.properties
datasource.password=ENC(加密后的密码)

5. 应用程序启动时自动解密

当你的Spring Boot应用程序启动时,Jasypt会自动检测配置文件中的ENC(...)字符串,并使用你配置的加密密码来解密这些字符串。解密后的明文将用于应用程序的配置中。

注意事项

  • 安全性:确保你的加密密码足够复杂且安全存储,避免将密码直接写在配置文件中。
  • 版本兼容性:注意你使用的Jasypt版本与其他库或框架的兼容性。
  • 算法选择:Jasypt支持多种加密算法,你可以根据需要在配置文件中指定加密算法。

通过以上步骤,你可以在你的Spring Boot应用程序中使用Jasypt来加密和解密配置文件中的敏感信息。

二、使用示例代码

1、通过工具类生成密文

在application.properties 中增加配置,或者通过-Djasypt.encryptor.password=123456参数来指定加密密码

# 用于加密的密码
jasypt.encryptor.password=123456

使用 stringEncryptor.encrypt() 生成密文

public class JasyptSecretTest {
    @Autowired
    private StringEncryptor stringEncryptor;
    @Value("${datasource.password}")
    private String password;
    @Test
    public void encrypt(){
        // 加密
        String encrypt = stringEncryptor.encrypt("root");
        System.out.println("encrypt = " + encrypt);
    }
}

2、在application.properties 中增加配置密文

# 加密后的密文,包裹在ENC() 中
datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)
# 用于加密的密码
jasypt.encryptor.password=123456

3、使用 @Value() 获取明文,也可以通过stringEncryptor.decrypt(encrypt)手动解密

@SpringBootTest
public class JasyptSecretTest {
    @Autowired
    private StringEncryptor stringEncryptor;
    @Value("${datasource.password}")
    private String password;
    @Test
    public void encrypt(){
        // 加密
        String encrypt = stringEncryptor.encrypt("root");
        System.out.println("encrypt = " + encrypt);
        // 解密,输入获取的加密字符串进行解密
        String decrypt = stringEncryptor.decrypt(encrypt);
        System.out.println("decrypt = " + decrypt);
    }
    @Test
    public void show(){
        System.out.println("password = " + password);
    }
}

原理说明

SpringBoot项目在启动过程中,会自动注入beanStringEncryptor,用于根据不同的加密算法初始化不同的加解密实现类,通过StringEncryptorBuilder.build()初始化不同的加密算法

BeanNamePlaceholderRegistryPostProcessor

@Bean(name = ENCRYPTOR_BEAN_NAME)
public StringEncryptor stringEncryptor(
        final EnvCopy envCopy,
        final BeanFactory bf) {
    final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);
    final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);
    return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf);
}

通过EncryptableMapPropertySourceWrapper重写了getProperty()方法,在获取配置值的时候,再做解密返回明文

DefaultPropertyResolver

@Override
public String resolvePropertyValue(String value) {
    return Optional.ofNullable(value)
            .map(environment::resolvePlaceholders)
            .filter(detector::isEncrypted)
            .map(resolvedValue -> {
                try {
                    // 获取密文
                    String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());
                    String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);
                    // 执行解密操作
                    return encryptor.decrypt(resolvedProperty);
                } catch (EncryptionOperationNotPossibleException e) {
                    throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +
                            "passwords match", e);
                }
            })
            .orElse(value);
}

三、Jasypt配置项

Jasypt支持多种配置参数以进行密码、Digest认证、文本和对象的加密。以下是Jasypt支持的一些常见配置参数:

配置参数描述示例
jasypt.encryptor.password加密器的密码,用于解密属性jasypt.encryptor.password=mySecretPassword
jasypt.encryptor.algorithm加密算法的名称jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterations获取密钥时使用的迭代次数jasypt.encryptor.keyObtentionIterations=1000
jasypt.encryptor.poolSize加密池的大小(如果使用了池化加密器)jasypt.encryptor.poolSize=1
jasypt.encryptor.providerName加密提供者的名称(如JCE提供者)jasypt.encryptor.providerName=SunJCE
jasypt.encryptor.saltGeneratorClassName盐生成器的类名jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.ivGeneratorClassName初始化向量生成器的类名jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator
jasypt.encryptor.stringOutputType加密字符串的输出类型(如base64)jasypt.encryptor.stringOutputType=base64
jasypt.encryptor.property.prefix加密属性前缀,用于识别加密属性jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix加密属性后缀,用于识别加密属性jasypt.encryptor.property.suffix=)
jasypt.encryptor.proxyPropertySources是否通过代理截取属性值以进行解密jasypt.encryptor.proxyPropertySources=true

注意:

  • 这些参数主要用于配置Jasypt加密器(StringEncryptor)的行为。
  • 在实际使用中,特别是生产环境中,jasypt.encryptor.password等敏感信息不应该硬编码在配置文件中,而是通过环境变量、命令行参数或外部配置文件等方式安全地传递。
  • Jasypt支持多种加密算法,如PBEWithMD5AndDES、PBEWithHMACSHA512ANDAES_256等,具体选择哪种算法取决于安全需求和环境配置。
  • 上述表格中的示例配置参数值仅为演示用途,实际使用时需要根据项目需求和安全策略进行配置。

四、支持的加密算法

Jasypt支持多种加密算法以保护敏感数据。以下是Jasypt支持的一些常见加密算法:

加密算法名称描述
PBEWithMD5AndDES基于密码的加密(PBE),使用MD5作为散列函数和DES作为加密算法。这是一种较旧的加密算法,但在某些旧系统中可能仍在使用
PBEWithMD5AndTripleDES与PBEWithMD5AndDES类似,但使用TripleDES作为加密算法,提供了更强的安全性。
PBEWithHMACSHA512ANDAES_256使用HMAC-SHA-512散列函数和AES-256加密算法的组合,提供了非常高的安全性。这是Jasypt较新版本中推荐的加密算法之一(默认值)
AES高级加密标准(AES),是一种广泛使用的对称加密算法。Jasypt支持不同长度的AES密钥,如AES-128、AES-192和AES-256
RSARivest-Shamir-Adleman(RSA)算法,是一种非对称加密算法。它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据

以上就是SpringBoot3使用Jasypt加密数据库用户名、密码等敏感信息的详细内容,更多关于SpringBoot3 Jasypt加密数据库信息的资料请关注程序员之家其它相关文章!

相关文章

  • Springboot居然可以设置动态的Banner(推荐)

    Springboot居然可以设置动态的Banner(推荐)

    这篇文章主要介绍了Springboot居然可以设置动态的Banner,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java中的大数类简单实现

    Java中的大数类简单实现

    这篇文章主要介绍了Java中的大数类简单实现的相关资料,需要的朋友可以参考下
    2017-03-03
  • SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

    SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

    这篇文章主要介绍了SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • springboot全局异常处理详解

    springboot全局异常处理详解

    本篇文章主要介绍了springboot全局异常处理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java poi导出Excel下载到客户端

    Java poi导出Excel下载到客户端

    这篇文章主要为大家详细介绍了Java poi导出Excel下载到客户端的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Mybatis无法获取带有下划线前缀的字段的值问题

    Mybatis无法获取带有下划线前缀的字段的值问题

    这篇文章主要介绍了Mybatis无法获取带有下划线前缀的字段的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot-RestTemplate实现调用第三方API的方式

    SpringBoot-RestTemplate实现调用第三方API的方式

    RestTemplate?是由?Spring?提供的一个?HTTP?请求工具,它提供了常见的REST请求方案的模版,例如?GET?请求、POST?请求、PUT?请求、DELETE?请求以及一些通用的请求执行方法?exchange?以及?execute,下面看下SpringBoot?RestTemplate调用第三方API的方式
    2022-12-12
  • SpringBoot整合RocketMQ的方法详解

    SpringBoot整合RocketMQ的方法详解

    这篇文章主要为大家详细介绍了SpringBoot整合RocketMQ的方法,文中的示例代码讲解详细,对我们学习有一定帮助,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 详解Spring Data操作Redis数据库

    详解Spring Data操作Redis数据库

    Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统。Spring data对Redis进行了很好的封装,用起来也是十分的得心应手,接下来通过本文给大家分享Spring Data操作Redis数据库,需要的朋友参考下
    2017-03-03
  • 浅谈java分页三个类 PageBean ResponseUtil StringUtil

    浅谈java分页三个类 PageBean ResponseUtil StringUtil

    下面小编就为大家带来一篇浅谈java分页三个类 PageBean ResponseUtil StringUtil。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论


http://www.vxiaotou.com