2026/2/19 2:07:03
网站建设
项目流程
wordpress网站访问量,网站在线布局,网络设计需求分析,验证码网站搭建一. 背景
当我们将项目部署到服务器上时#xff0c;一般会在jar包的同级目录下加上application.yml配置文件#xff0c;这样可以在不重新换包的情况下修改配置。
一般会将数据库连接、Redis连接等放到配置文件中。
例如配置数据库连接#xff1a;
spring:servlet:multipart:…一. 背景当我们将项目部署到服务器上时一般会在jar包的同级目录下加上application.yml配置文件这样可以在不重新换包的情况下修改配置。一般会将数据库连接、Redis连接等放到配置文件中。例如配置数据库连接spring: servlet: multipart: max-file-size: 10MB # 文件大小限制 max-request-size: 100MB # 请求大小限制 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 123456这种方式存在安全隐患如果配置文件泄露就会造成数据库密码泄露。所以需要将配置文件中数据库密码等敏感数据加密然后在使用的时候解密后再使用。推荐使用第三种方式。二. 方法介绍本文介绍三种方式。1. 解密方法嵌入到业务逻辑代码中例如我可以在service或者正常的业务代码中去加密后再使用。但是这种和业务耦合度高不推荐。2. 使用jasypt2.1 第一步pom引入依赖dependency groupIdcom.github.ulisesbocchio/groupId artifactIdjasypt-spring-boot-starter/artifactId version2.1.2/version /dependency2.2 第二步application.yml中增加jasypt配置配置文件里配置该算法加解密的盐值。jaspypt算法不需要我们自己实现该第三方库已经实现了。我们仅需要配置这个盐值即可。# 如果密文加盐需要配置盐值 jasypt: encryptor: password: ueiej8e8r2.3 第三步application.yml中密文替代明文。配置文件里将加密后得到的密文用ENC(密文)方式配置即可。项目启动的时候程序会自动去解析配置文件中值为ENC(密文)格式的配置然后解密后加载程序。数据的加密可以自己实现工具类来加密或者一些在线网站提供jasypt的加解密得到加密后的密文后将密文替换明文即可。例如password: ENC(UBHpSHxjL2F8ZiNTJUciZw)到此就全部结束了。项目启动的时候程序会自动去解密并注入到实际的springApplication中。优缺点优点是引入第三方库简单匹配一下即可业务代码不需要任何改动。缺点是把jasypt的盐放到配置文件中那实际上你的加密数据也跟裸奔一样了别人一样可以用这个jasypt解密得到你的数据库密码等加密数据。3. 使用自定义加解密算法并自动装配3.1 第一步确定加解密规则编写工具类我们可以自定义加解密算法来实现数据的加解密这里采用AES算法。工具类的代码省略。3.2 第二步实现EnvironmentPostProcessorSpring Boot没有为加密属性值提供任何内置支持。EnvironmentPostProcessor接口允许你在应用程序启动前操作Environment可以用来修改SpringEnvironment中包含的值。实现接口并在接口里遍历所有的配置项将指定的配置项解密后重新写入Environment。示例public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor { Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Properties props new Properties(); // 临时存储需要替换的配置 // 假设加密密码前缀为 ENC(后缀为 ) MutablePropertySources propertySources environment.getPropertySources(); for (PropertySource? propertySource : propertySources) { if (propertySource instanceof EnumerablePropertySource) { EnumerablePropertySource? enumerablePropertySource (EnumerablePropertySource?) propertySource; String[] propertyNames enumerablePropertySource.getPropertyNames(); // 遍历所有配置key:value for (String propertyName : propertyNames) { String propertyVal environment.getProperty(propertyName); // 根据自己写的规则来解析那些配置是需要解密的 if (propertyVal ! null propertyVal.startsWith(ENC() propertyVal.endsWith())) { // 解析得到加密的数据 String encryptedValue propertyVal.substring(4, propertyVal.length() - 1); // 调用自定义工具类解密 String decryptedValue AESUtil.decryptEcbMode(encryptedValue); // 保存需要替换的配置 props.put(propertyName, decryptedValue); } } } } // 添加解密后的属性到环境中 if (!props.isEmpty()) { PropertiesPropertySource pps new PropertiesPropertySource(decryptedProperties, props); environment.getPropertySources().addFirst(pps); } } }3.3 自动装配在resources/META-INF/spring.factories中注册EnvironmentPostProcessor。org.springframework.boot.env.EnvironmentPostProcessor your.package.DecryptEnvironmentPostProcessor这里把自己实现的.DecryptEnvironmentPostProcesso的全路径放进去即可。没有META-INF/spring.factories文件的直接建好目录新增这个文件就行。3.4 配置文件密文替换明文使用自定义的工具类将密码加密得到密文。用密文替换配置中的密文。这里我依然使用ENC(密文)的格式去配置这个规则可以自己定义只要修改DecryptEnvironmentPostProcessor的方法中的匹配逻辑即可。例如spring: datasource: password: ENC(你的加密密码)注意事项你可以写死你的加密的配置项然后在postProcessEnvironme()方法里找到对应的配置项解密。或者你可以将加密的所有数据都用ENC加密的数据表示然后在postProcessEnvironme方法里匹配后解密即可。当然这里的编写规则你可以自己定义只要能匹配出来即可。例如我的配置如下spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: ENC(UBHpSHxjL2F8ZiNTJUciZw)其中数据库的密码就是AES算法解密后的结果。4. 总结建议用第三种方式因为这种加密算法可以自定义并且不需要把加解密的秘钥放到配置文件里即便有人拿到配置文件也无法得到真实的密码更加的安全。而且第三种方式对业务代码没有侵入也不需要特定引入第三方库和配置其他东西。