使用 Jasypt 为Spring Boot配置文件中的密码加密

在本教程中,我将指导您如何加密Spring Boot应用程序配置文件(应用程序.properties或应用程序.yml)中的敏感信息,例如数据源的用户名和密码,SMTP服务器的凭据等...使用Jasypt 库 – 为了提高基于Spring框架的Java应用程序的安全性。要学习本教程,您必须在计算机上(在任何 IDE 外部)安装 Maven。

1. 什么是Jasypt ?

Jasypt代表Java简化加密 - 一种高安全性和高性能的加密库,允许开发人员以最小的工作量为其项目添加基本的加密功能,而无需深入了解加密的工作原理。Jasypt提供基于标准的加密技术,可用于加密密码,文本,数字,二进制文件...它可以无缝、透明地与企业框架(如弹簧和休眠)集成。贾西普特易于使用,但高度可配置。有关更多信息,请访问Jasypt
主页。

2. 声明Jasypt Spring Boot和Jasypt Maven 插件的依赖关系

为了将 Jasypt 库用于弹簧启动应用程序,您需要在项目的 pom.xml 文件中声明以下依赖项:

1
2
3
4
5
<dependency>
  <groupId>com.github.ulisesbocchiogroupId>
  <artifactId>jasypt-spring-boot-starterartifactId>
  <version>3.0.3version>
dependency>

这会将一些 JAR 文件添加到项目的类路径中,这有助于 Jasypt 透明地解密应用程序配置文件中的加密值。

然后,您还需要声明Jasypt ·Maven 插件,如下所示:

1
2
3
4
5
<plugin>
   <groupId>com.github.ulisesbocchiogroupId>
   <artifactId>jasypt-maven-pluginartifactId>
   <version>3.0.3version>
 plugin>

此插件很重要,因为它允许使用Maven命令进行加密和解密,如以下各节所述。

3. 加密和解密单个字符串值

打开一个新的命令提示符窗口。将当前目录更改为 pom.xml 文件所在的项目目录。并键入以下命令:

1
mvn jasypt:encrypt-value -Djasypt.encryptor.password=cafe21 -Djasypt.plugin.value=n@mHm2020

这将运行 Jasypt Maven 插件来加密字符串,n@mHm2020使用私钥 cafe21 的默认加密配置。在输出中,你会看到它打印出类似下面的内容:

1
ENC(MBTWfX8gqMevQe5CKW0pToMbajnpJk0zlb3yoooiSWPjkfYrE8TFNF6vDEMXTu/j)

在这里,加密的值被包装在 ENC() 中,然后您可以使用此值替换配置文件中的密码。如果再次运行上述命令,您将看到不同的加密值,因为默认加密器使用随机生成器。这意味着字符串可以是不同的加密值,尽管私钥是相同的。默认加密算法是双向的,这意味着您可以进行解密。键入以下命令:

1
mvn jasypt:decrypt-value -Djasypt.encryptor.password=cafe21 -Djasypt.plugin.value=MBTWfX8gqMevQe5CKW0pToMbajnpJk0zlb3yoooiSWPjkfYrE8TFNF6vDEMXTu/j

这将使用带有私钥 cafe21 的默认加密配置解密指定的值。然后你会看到它打印原始值 [email protected] 这些加密和解密命令是你应该熟悉的非常基本的命令。

4. 加密应用程序属性文件中的凭据

假设您要在以下应用程序属性文件中加密 Spring 数据源的用户名和密码:

1
2
3
4
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/shopmedb
spring.datasource.username=root
spring.datasource.password=password

首先,将用户名和密码的值包装在 DEC() 中,如下所示:

1
2
3
4
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/shopmedb
spring.datasource.username=DEC(root)
spring.datasource.password=DEC(password)

在这里,DEC() 是一个占位符,它告诉 Jasypt 要加密什么,其余值保持不变。然后在命令提示符下,键入:

1
mvn jasypt:encrypt -Djasypt.encryptor.password=cafe21

然后,它将应用程序属性文件中的 DEC() 占位符替换为加密的值:

1
2
3
4
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/shopmedb
spring.datasource.username=ENC(9tl1aMX4Ije8n0+IcjyS...)
spring.datasource.password=ENC(IQi6U2g7sz4pw6wL4GoY...)

瞧!非常简单方便,对吧?无需手动复制和粘贴。只需将要加密的值放在 DEC() 中,然后运行 mvn 贾西普特:加密 命令。

5. 使用Jasypt 运行Spring Boot应用程序

现在,要运行Spring Boot应用程序,您需要在命令提示符中将私钥密码作为VM参数传递,如下所示:

1
java -Djasypt.encryptor.password=cafe21 –jar yourapp.jar

要在 Eclipse 或春季工具套件 IDE 中运行 Spring Boot 应用程序,您需要通过传递如下所示的 VM 参数来编辑运行配置:启动应用程序,当 Jasypt 透明地解密加密的凭据时,它将平稳运行。

使用 Jasypt 为Spring Boot配置文件中的密码加密_第1张图片

6. 在 Spring 应用程序配置文件中解密凭据

如果要在弹簧启动配置文件中查看加密值的原始值,请键入以下 Maven 命令:

1
mvn jasypt:decrypt -Djasypt.encryptor.password=cafe21

Jasypt 将在输出中打印应用程序属性文件的内容,就像加密之前一样。因此,此命令对于检查和验证目的很有用。请注意,它不会更新配置文件。

7. 加密应用程序.yml 文件中的凭据

默认情况下,贾西普特将更新应用程序属性文件。如果您在项目中使用 application.yml,请在命令中指定文件的路径,如下所示:

1
mvn jasypt:encrypt -Djasypt.encryptor.password=cafe21 -Djasypt.plugin.path="file:src/main/resources/application.yml"

使用此语法,可以对任何所需的属性文件中的凭据进行加密。

8. 使用新的加密密码重新加密

如果要更改加密器的私钥(密码),只需使用以下命令:

1
mvn jasypt:reencrypt -Djasypt.plugin.old.password=cafe21 -Djasypt.encryptor.password=10duke

然后,Jasypt Maven插件将使用旧密码cafe21加密的值替换为使用新密码10duke加密的新值 - 并且您可以立即更新配置文件。非常 方便 。

9. 在 Spring 配置类中配置加密器

Jasypt 易于使用,正如您在上面的命令中看到的那样。如果您具有一定的密码学知识并且想要自定义加密器的设置,它也具有高度可配置性。例如,在项目中创建一个新的 Spring 配置类,如下所示:

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
package net.codejava.security;
 
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class JasyptAdvancedConfig {
 
    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor getPasswordEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
         
        config.setPassword("password"); // encryptor's private key
         
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
         
        encryptor.setConfig(config);
         
        return encryptor;
    }
}

此代码将覆盖默认加密配置,因此您需要编写一些代码来加密密码,如下所示:

1
2
3
String rawPassword = "password";
String encryptedPassword = encryptor.encrypt(rawPassword);
System.out.println(encryptedPassword);

然后通过将加密值放在 ENC() 中来更新弹簧启动应用程序配置文件,如下所示:

1
2
3
4
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/shopmedb
spring.datasource.username=ENC(encrypted_username)
spring.datasource.password=ENC(encrypted_password)

这是关于使用Jasypt库在弹簧启动配置文件中加密密码的教程。

 

你可能感兴趣的:(1024程序员节)