SpringBoot安全升级指南:运用ENC加密强化配置文件防护

打印 上一主题 下一主题

主题 1749|帖子 1749|积分 5247

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
使用 Jasypt 加密 Spring Boot 配置中的敏感信息

在开辟应用步伐时,保护敏感信息如数据库密码、API 密钥等黑白常重要的。Spring Boot 提供了多种方式来处理配置文件中的敏感数据,其中一种有效的方法是使用 Jasypt(Java Simplified Encryption)。本文将先容怎样使用 Jasypt 来加密和解密 Spring Boot 应用步伐中的敏感信息,并提供一个简朴的命令行工具用于天生加密后的值。
1. 添加依靠

起首,在你的 pom.xml 文件中添加必要的依靠项:
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>com.github.ulisesbocchio</groupId>
  4.         <artifactId>jasypt-spring-boot-starter</artifactId>
  5.         <version>3.0.4</version>
  6.     </dependency>
  7.     <!-- 其他依赖 -->
  8. </dependencies>
  9. <build>
  10.     <plugins>
  11.         <plugin>
  12.             <groupId>org.springframework.boot</groupId>
  13.             <artifactId>spring-boot-maven-plugin</artifactId>
  14.         </plugin>
  15.     </plugins>
  16. </build>
复制代码
确保你选择了与你的 Spring Boot 版本兼容的 Jasypt 版本。
2. 创建自界说属性解析器

创建一个类 CustomEncryptablePropertyResolver 来实现属性值的解密逻辑:
  1. import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver;
  2. import org.jasypt.encryption.StringEncryptor;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public class CustomEncryptablePropertyResolver implements EncryptablePropertyResolver {
  7.     private final StringEncryptor stringEncryptor;
  8.     @Autowired
  9.     public CustomEncryptablePropertyResolver(StringEncryptor stringEncryptor) {
  10.         this.stringEncryptor = stringEncryptor;
  11.     }
  12.     @Override
  13.     public String resolvePropertyValue(String value) {
  14.         if (value != null && value.startsWith("ENC(") && value.endsWith(")")) {
  15.             return stringEncryptor.decrypt(value.substring(4, value.length() - 1));
  16.         }
  17.         return value;
  18.     }
  19. }
复制代码
该类负责查抄属性值是否以 "ENC(" 开头并以 ")" 末端,如果是,则对其举行解密。
3. 创建命令行运行器

为了方便地加密密码,我们可以创建一个命令行运行器 EncryptCommandLineRunner:
  1. import org.jasypt.encryption.StringEncryptor;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.CommandLineRunner;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public class EncryptCommandLineRunner implements CommandLineRunner {
  7.     private final StringEncryptor stringEncryptor;
  8.     @Autowired
  9.     public EncryptCommandLineRunner(StringEncryptor stringEncryptor) {
  10.         this.stringEncryptor = stringEncryptor;
  11.     }
  12.     @Override
  13.     public void run(String... args) throws Exception {
  14.         String password = "linkdata@2019"; // 替换为你要加密的实际密码
  15.         extracted(password);
  16.         password = "auditsys_sino@2020_welcome123"; // 替换为你要加密的实际密码
  17.         extracted(password);
  18.     }
  19.     private void extracted(String password) {
  20.         String encryptedPassword = stringEncryptor.encrypt(password);
  21.         System.out.println("Encrypted Password: ENC(" + encryptedPassword + ")");
  22.     }
  23. }
复制代码
这将主动加密指定的密码并在启动时打印出来。
4. 配置 Jasypt

接下来,我们需要配置 Jasypt 以便它知道哪些属性需要被加密/解密。创建配置类 JasyptConfig:
  1. import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyFilter;
  2. import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver;
  3. import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
  4. import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.util.Arrays;
  8. import java.util.HashSet;
  9. import java.util.Set;
  10. @Configuration
  11. public class JasyptConfig {
  12.     private static final Set<String> ENCRYPTED_PROPERTY_KEYS = new HashSet<>(Arrays.asList(
  13.             "spring.datasource.druid.master.password",
  14.             "spring.redis.password" // 添加其他需要加密处理的属性键
  15.     ));
  16.     @Bean(name = "stringEncryptor")
  17.     public PooledPBEStringEncryptor stringEncryptor() {
  18.         PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
  19.         SimpleStringPBEConfig config = new SimpleStringPBEConfig();
  20.         config.setPassword("your-secret-key"); // 使用你自己的密钥
  21.         config.setAlgorithm("PBEWithMD5AndDES");
  22.         config.setKeyObtentionIterations("1000");
  23.         config.setPoolSize("1");
  24.         config.setProviderName("SunJCE");
  25.         config.setSaltGeneratorClassName("org.jasypt.salt.ZeroSaltGenerator"); // 禁用盐
  26.         config.setStringOutputType("base64");
  27.         encryptor.setConfig(config);
  28.         return encryptor;
  29.     }
  30.     @Bean
  31.     public EncryptablePropertyResolver encryptablePropertyResolver() {
  32.         return new CustomEncryptablePropertyResolver(stringEncryptor());
  33.     }
  34.     @Bean
  35.     public EncryptablePropertyFilter encryptablePropertyFilter() {
  36.         return (propertySource, key) -> ENCRYPTED_PROPERTY_KEYS.contains(key);
  37.     }
  38. }
复制代码
在这个配置类中,我们界说了一个静态集合 ENCRYPTED_PROPERTY_KEYS 来包含全部需要加密处理的属性键名,并设置了加密算法和其他参数。
5. 运行项目

当你运行项目时,EncryptCommandLineRunner 将会主动实行,并输出加密后的密码。你可以使用这些加密后的值替换配置文件中的明文密码,例如:
  1. spring:
  2.   datasource:
  3.     druid:
  4.       master:
  5.         password: ENC(your-encrypted-password)
复制代码
这样,你就乐成地加密了配置文件中的敏感信息,增长了应用步伐的安全性。通过上述步骤,你可以轻松管理和保护应用中的敏感数据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表