2025年java spring boot 数据库密码解密(springboot配置数据库密码加密)

java spring boot 数据库密码解密(springboot配置数据库密码加密)使用 Jasypt Java Simplified Encryption 进行数据加密和解密主要涉及几个步骤 包括引入依赖 配置加密密码 加密敏感信息 将加密信息存储到配置文件中 以及应用程序启动时自动解密 以下是详细的使用说明 首先 你需要在你的项目中引入 Jasypt 的依赖 如果你是使用 Maven 构建项目 可以在 pom xml 文件中添加如下依赖 注意版本号可能随时间更新 请参考最新版本

大家好,我是讯享网,很高兴认识大家。



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

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

1

2

3

4

5

<dependency>

    <groupId>com.github.ulisesbocchio</groupId>

    <artifactId>jasypt-spring-boot-starter</artifactId>

    <version>3.0.5</version>

</dependency>

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

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

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

1

2

# application.properties

jasypt.encryptor.password=your_encryption_password

或者,在application.yml中:

1

2

3

jasypt:

  encryptor:

    password: your_encryption_password

  • 然而,将密码直接写在配置文件中可能存在安全风险。因此,更推荐的做法是通过启动参数或环境变量来传递这个密码。
  • 通过启动参数指定:在启动应用程序时,可以通过-Djasypt.encryptor.password=your_encryption_password参数来指定加密密码。
  • 使用环境变量:在某些情况下,使用环境变量来存储敏感信息(如加密密码)可能更为安全。具体方法取决于你的应用程序部署环境。

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

  • 使用Jasypt CLI工具:Jasypt提供了一个命令行界面(CLI)工具,允许你在命令行中加密和解密字符串。你需要下载Jasypt的jar包,并在命令行中运行相应的命令。
  • 使用Jasypt API:在你的Java应用程序中,你可以通过注入StringEncryptor接口的实现类来编程方式加密和解密字符串。这通常在你的Spring Boot应用程序中通过自动装配完成。

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

1

2

# application.properties

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

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

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

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

1、通过工具类生成密文

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

1

2

# 用于加密的密码

jasypt.encryptor.password=

使用 stringEncryptor.encrypt() 生成密文

1

2

3

4

5

6

7

8

9

10

11


讯享网

12

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 中增加配置密文

1

2

3

4

# 加密后的密文,包裹在ENC() 中

datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)

# 用于加密的密码

jasypt.encryptor.password=

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@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

1

2

3

4

5

6

7

8

@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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@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支持多种配置参数以进行密码、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支持的一些常见加密算法:

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

讯享网

小讯
上一篇 2025-06-10 07:22
下一篇 2025-06-16 09:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/173659.html