在本教程中,我将指导您如何加密Spring Boot应用程序配置文件(应用程序.properties或应用程序.yml)中的敏感信息,例如数据源的用户名和密码,SMTP服务器的凭据等...使用Jasypt 库 – 为了提高基于Spring框架的Java应用程序的安全性。要学习本教程,您必须在计算机上(在任何 IDE 外部)安装 Maven。
Jasypt代表Java简化加密 - 一种高安全性和高性能的加密库,允许开发人员以最小的工作量为其项目添加基本的加密功能,而无需深入了解加密的工作原理。Jasypt提供基于标准的加密技术,可用于加密密码,文本,数字,二进制文件...它可以无缝、透明地与企业框架(如弹簧和休眠)集成。贾西普特易于使用,但高度可配置。有关更多信息,请访问Jasypt
主页。
为了将 Jasypt 库用于弹簧启动应用程序,您需要在项目的 pom.xml 文件中声明以下依赖项:
1
2
3
4
5
|
< dependency >
< groupId >com.github.ulisesbocchio groupId >
< artifactId >jasypt-spring-boot-starter artifactId >
< version >3.0.3 version >
dependency >
|
这会将一些 JAR 文件添加到项目的类路径中,这有助于 Jasypt 透明地解密应用程序配置文件中的加密值。
然后,您还需要声明Jasypt ·Maven 插件,如下所示:
1
2
3
4
5
|
< plugin >
< groupId >com.github.ulisesbocchio groupId >
< artifactId >jasypt-maven-plugin artifactId >
< version >3.0.3 version >
plugin >
|
此插件很重要,因为它允许使用Maven命令进行加密和解密,如以下各节所述。
打开一个新的命令提示符窗口。将当前目录更改为 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] 这些加密和解密命令是你应该熟悉的非常基本的命令。
假设您要在以下应用程序属性文件中加密 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 贾西普特:加密 命令。
现在,要运行Spring Boot应用程序,您需要在命令提示符中将私钥密码作为VM参数传递,如下所示:
1
|
java -Djasypt.encryptor.password=cafe21 –jar yourapp.jar
|
要在 Eclipse 或春季工具套件 IDE 中运行 Spring Boot 应用程序,您需要通过传递如下所示的 VM 参数来编辑运行配置:启动应用程序,当 Jasypt 透明地解密加密的凭据时,它将平稳运行。
如果要在弹簧启动配置文件中查看加密值的原始值,请键入以下 Maven 命令:
1
|
mvn jasypt:decrypt -Djasypt.encryptor.password=cafe21
|
Jasypt 将在输出中打印应用程序属性文件的内容,就像加密之前一样。因此,此命令对于检查和验证目的很有用。请注意,它不会更新配置文件。
默认情况下,贾西普特将更新应用程序属性文件。如果您在项目中使用 application.yml,请在命令中指定文件的路径,如下所示:
1
|
mvn jasypt:encrypt -Djasypt.encryptor.password=cafe21 -Djasypt.plugin.path="file:src/main/resources/application.yml"
|
使用此语法,可以对任何所需的属性文件中的凭据进行加密。
如果要更改加密器的私钥(密码),只需使用以下命令:
1
|
mvn jasypt:reencrypt -Djasypt.plugin.old.password=cafe21 -Djasypt.encryptor.password=10duke
|
然后,Jasypt Maven插件将使用旧密码cafe21加密的值替换为使用新密码10duke加密的新值 - 并且您可以立即更新配置文件。非常 方便 。
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库在弹簧启动配置文件中加密密码的教程。