在本教程中,我将指导您如何加密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 文件添加到项目的类路径中&#xff0c;这有助于 Jasypt 透明地解密应用程序配置文件中的加密值。
然后&#xff0c;您还需要声明Jasypt ·Maven 插件&#xff0c;如下所示&#xff1a;
1 2 3 4 5 | < plugin > < groupId >com.github.ulisesbocchio groupId > < artifactId >jasypt-maven-plugin artifactId > < version >3.0.3 version >
plugin > |
此插件很重要&#xff0c;因为它允许使用Maven命令进行加密和解密&#xff0c;如以下各节所述。
打开一个新的命令提示符窗口。将当前目录更改为 pom.xml 文件所在的项目目录。并键入以下命令&#xff1a;
1 | mvn jasypt:encrypt-value -Djasypt.encryptor.password&#61;cafe21 -Djasypt.plugin.value&#61;n&#64;mHm2020 |
这将运行 Jasypt Maven 插件来加密字符串&#xff0c;n&#64;mHm2020使用私钥 cafe21 的默认加密配置。在输出中&#xff0c;你会看到它打印出类似下面的内容&#xff1a;
1 | ENC(MBTWfX8gqMevQe5CKW0pToMbajnpJk0zlb3yoooiSWPjkfYrE8TFNF6vDEMXTu/j) |
在这里&#xff0c;加密的值被包装在 ENC&#xff08;&#xff09; 中&#xff0c;然后您可以使用此值替换配置文件中的密码。如果再次运行上述命令&#xff0c;您将看到不同的加密值&#xff0c;因为默认加密器使用随机生成器。这意味着字符串可以是不同的加密值&#xff0c;尽管私钥是相同的。默认加密算法是双向的&#xff0c;这意味着您可以进行解密。键入以下命令&#xff1a;
1 | mvn jasypt:decrypt-value -Djasypt.encryptor.password&#61;cafe21 -Djasypt.plugin.value&#61;MBTWfX8gqMevQe5CKW0pToMbajnpJk0zlb3yoooiSWPjkfYrE8TFNF6vDEMXTu/j |
这将使用带有私钥 cafe21 的默认加密配置解密指定的值。然后你会看到它打印原始值 n&#64;mHm2020.So 这些加密和解密命令是你应该熟悉的非常基本的命令。
假设您要在以下应用程序属性文件中加密 Spring 数据源的用户名和密码&#xff1a;
1 2 3 4 | spring.jpa.hibernate.ddl-auto&#61;none spring.datasource.url&#61;jdbc:mysql://localhost:3306/shopmedb spring.datasource.username&#61;root spring.datasource.password&#61;password |
首先&#xff0c;将用户名和密码的值包装在 DEC&#xff08;&#xff09; 中&#xff0c;如下所示&#xff1a;
1 2 3 4 | spring.jpa.hibernate.ddl-auto&#61;none spring.datasource.url&#61;jdbc:mysql://localhost:3306/shopmedb spring.datasource.username&#61;DEC(root) spring.datasource.password&#61;DEC(password) |
在这里&#xff0c;DEC&#xff08;&#xff09; 是一个占位符&#xff0c;它告诉 Jasypt 要加密什么&#xff0c;其余值保持不变。然后在命令提示符下&#xff0c;键入&#xff1a;
1 | mvn jasypt:encrypt -Djasypt.encryptor.password&#61;cafe21 |
然后&#xff0c;它将应用程序属性文件中的 DEC&#xff08;&#xff09; 占位符替换为加密的值&#xff1a;
1 2 3 4 | spring.jpa.hibernate.ddl-auto&#61;none spring.datasource.url&#61;jdbc:mysql://localhost:3306/shopmedb spring.datasource.username&#61;ENC(9tl1aMX4Ije8n0&#43;IcjyS...) spring.datasource.password&#61;ENC(IQi6U2g7sz4pw6wL4GoY...) |
瞧&#xff01;非常简单方便&#xff0c;对吧&#xff1f;无需手动复制和粘贴。只需将要加密的值放在 DEC&#xff08;&#xff09; 中&#xff0c;然后运行 mvn 贾西普特&#xff1a;加密 命令。
现在&#xff0c;要运行Spring Boot应用程序&#xff0c;您需要在命令提示符中将私钥密码作为VM参数传递&#xff0c;如下所示&#xff1a;
1 | java -Djasypt.encryptor.password&#61;cafe21 –jar yourapp.jar |
要在 Eclipse 或春季工具套件 IDE 中运行 Spring Boot 应用程序&#xff0c;您需要通过传递如下所示的 VM 参数来编辑运行配置&#xff1a;启动应用程序&#xff0c;当 Jasypt 透明地解密加密的凭据时&#xff0c;它将平稳运行。
如果要在弹簧启动配置文件中查看加密值的原始值&#xff0c;请键入以下 Maven 命令&#xff1a;
1 | mvn jasypt:decrypt -Djasypt.encryptor.password&#61;cafe21 |
Jasypt 将在输出中打印应用程序属性文件的内容&#xff0c;就像加密之前一样。因此&#xff0c;此命令对于检查和验证目的很有用。请注意&#xff0c;它不会更新配置文件。
默认情况下&#xff0c;贾西普特将更新应用程序属性文件。如果您在项目中使用 application.yml&#xff0c;请在命令中指定文件的路径&#xff0c;如下所示&#xff1a;
1 | mvn jasypt:encrypt -Djasypt.encryptor.password&#61;cafe21 -Djasypt.plugin.path&#61;"file:src/main/resources/application.yml" |
使用此语法&#xff0c;可以对任何所需的属性文件中的凭据进行加密。
如果要更改加密器的私钥&#xff08;密码&#xff09;&#xff0c;只需使用以下命令&#xff1a;
1 | mvn jasypt:reencrypt -Djasypt.plugin.old.password&#61;cafe21 -Djasypt.encryptor.password&#61;10duke |
然后&#xff0c;Jasypt Maven插件将使用旧密码cafe21加密的值替换为使用新密码10duke加密的新值 - 并且您可以立即更新配置文件。非常 方便 。
Jasypt 易于使用&#xff0c;正如您在上面的命令中看到的那样。如果您具有一定的密码学知识并且想要自定义加密器的设置&#xff0c;它也具有高度可配置性。例如&#xff0c;在项目中创建一个新的 Spring 配置类&#xff0c;如下所示&#xff1a;
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; &#64;Configuration public class JasyptAdvancedConfig { &#64;Bean (name &#61; "jasyptStringEncryptor" ) public StringEncryptor getPasswordEncryptor() { PooledPBEStringEncryptor encryptor &#61; new PooledPBEStringEncryptor(); SimpleStringPBEConfig config &#61; new SimpleStringPBEConfig(); config.setPassword( "password" ); // encryptor&#39;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; } } |
此代码将覆盖默认加密配置&#xff0c;因此您需要编写一些代码来加密密码&#xff0c;如下所示&#xff1a;
1 2 3 | String rawPassword &#61; "password" ; String encryptedPassword &#61; encryptor.encrypt(rawPassword); System.out.println(encryptedPassword); |
然后通过将加密值放在 ENC&#xff08;&#xff09; 中来更新弹簧启动应用程序配置文件&#xff0c;如下所示&#xff1a;
1 2 3 4 | spring.jpa.hibernate.ddl-auto&#61;none spring.datasource.url&#61;jdbc:mysql://localhost:3306/shopmedb spring.datasource.username&#61;ENC(encrypted_username) spring.datasource.password&#61;ENC(encrypted_password) |
这是关于使用Jasypt库在弹簧启动配置文件中加密密码的教程。