在本教程中,我将指导您如何加密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.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命令进行加密和解密,如以下各节所述。
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 的默认加密配置解密指定的值。然后你会看到它打印原始值 n@mHm2020.So 这些加密和解密命令是你应该熟悉的非常基本的命令。
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 透明地解密加密的凭据时,它将平稳运行。
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库在弹簧启动配置文件中加密密码的教程。