如何给application.yml文件的敏感信息加密?

Hello,大家好,我是云帆。在我们传统的基于SpringBoot开发的项目中,在配置文件里,或多或少的都会有一些敏感信息,这样就会丢失一定的安全性,所以我们就需要,对敏感信息进行加密。我们可以使用jasypt工具进行加密。

好了废话不多少,直接进入正题:

  1. 导入依赖xml

<dependency>      <groupId>com.github.ulisesbocchio</groupId>      <artifactId>jasypt-spring-boot-starter</artifactId>      <version>3.0.5</version>  </dependency>

我的Demo里使用的是SpringBoot3.0之后的版本,所以大家如果像我一样都是基于SpringBoot3.0之后的,jasypt一定要使用3.0.5以后的版本。

2. 使用jasypt

我们在配置文件里写几行配置yaml

jasypt:    encryptor:      password: sdjsdbshdbfuasd      property:        prefix: ENC(      suffix: )

password是加密密码,必须配置这一项,值可以随便输入。prefixsuffix是默认配置,也可以自定义,默认值就是ENC(),这个是自动解密使用的。

2.1. 加/解密

jasypt 提供了一个工具类接口,StringEncryptor,这个接口提供了加解密方法。下面是他的源码。

java

public interface StringEncryptor {        /**      * 加密输入信息      *      * @param 要加密的信息      * @return 加密结果      */      public String encrypt(String message);  

/** * 解密加密信息 * * @param 加密信息(encryptedMessage) 要解密的加密信息 * @return 解密结果 */ public String decrypt(String encryptedMessage); }

我们在 test 测试类中,将要进行加密的文本使用encrypt方法进行加密java

@SpringBootTest  @Slf4j  class JasryptApplicationTests {        @Autowired      private StringEncryptor stringEncryptor;  
@Test void contextLoads() { String username = stringEncryptor.encrypt("root"); String password = stringEncryptor.encrypt("root"); log.info("username encrypt is {}", username); log.info("password encrypt is {}", password); log.info("username decrypt is {}", stringEncryptor.decrypt(username)); log.info("password decrypt is {}", stringEncryptor.decrypt(password)); } }

上边代码,加密的内容是,MySQL的用户名密码,同时对它们进行加密和解密,你当然可以对任意配置信息进行加解密操作。看看输出内容:log

2023-07-23T18:59:50.621+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : username encrypt is 61zSoixtNayUruXt5x84kEKO9jGnZObTGCa1+k5Yg9F7qSUiZvp5fG31AMuVqrot2023-07-23T18:59:50.621+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : password encrypt is a6snCZCkbQFKkQqxN2bS18ags04yZxH+THwIL5RjGocEjG9sLkJvvasPFFVxEBWv2023-07-23T18:59:50.623+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : username decrypt is root2023-07-23T18:59:50.630+08:00  INFO 9489 --- [           main] c.
e.jasrypt.JasryptApplicationTests      : password decrypt is root

加密默认使用的是PBEWITHHMACSHA512ANDAES_256加密 我们将密文,替换到数据源,配置:yaml

spring:  datasource:  driver-class-name: com.mysql.cj.jdbc.Driver  url: jdbc:mysql://localhost:3306/honey?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8  username: ENC(61zSoixtNayUruXt5x84kEKO9jGnZObTGCa1+k5Yg9F7qSUiZvp5fG31AMuVqrot)  password: ENC(a6snCZCkbQFKkQqxN2bS18ags04yZxH+THwIL5RjGocEjG9sLkJvvasPFFVxEBWv)

⚠️注意别忘了加上前缀和后缀,如上边代码。

这个时候就已经完成了,但是官方不建议我们将加密密码放到配置文件中,我们应作为系统属性、命令行参数或环境变量传递,只要其名称是 jasypt.encryptor.password,就能正常工作。

我们可以将项目打为jar包然后使用 java -jar命令

java -jar jasrypt-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=加密密码
⚠️加密密码必须与之前给属性加密时用的加密密码一致。

3. 结尾

好了,分享到这里就结束了,希望小伙伴们多多点赞,如果有建议,欢迎留言。

最后给大家推荐几个优秀的职位,详情请查看链接地址:【HBLOG10月内推】让你的职业生涯腾飞!

相关推荐

  • 浅谈前端出现率高的设计模式
  • 华为全面完成5G-A技术性能测试;苹果将在iOS 18上推出生成式AI功能;Mojo编程语言发布 Mac 版本|极客头条
  • 看这里!!1024个程序员关于AI PC 的联想
  • 面试官:如何判断两个数组的内容是否相等???
  • 强化学习的一周「GitHub 热点速览」
  • 这些过时的前端技术请不要再继续学了!
  • 如何使用 Pinia ORM 管理 Vue 中的状态
  • 知乎热帖:为什么很多人在一家公司工作 2-3 年就会跳槽?
  • 简单有效!Direct Inversion: 三行代码提升基于Diffusion的图像编辑效果
  • 复旦大学自然语言处理实验室:如何构建和训练ChatGPT
  • 提升图神经网络性能方法综述
  • 前端程序员是怎么做物联网开发的
  • 8 城联动,1024 程序员节技术嘉年华成功举办!
  • 聚力谋发展,开源耀星城,2023 CCF中国开源大会圆满落幕
  • 一个实验性的开源项目DB-GPT:使用本地大模型与数据和环境进行交互
  • 1022.AI日报:GPT-5 可能不会比 GPT-4 好多少?
  • 国民游戏王者荣耀的地图轻量解决方案
  • [开源]基于SaaS模式的进销存+简单财务的系统,进销存多商户系统
  • 开源一个在线课程资料的管理系统开源项目,很不错
  • 这样的面试,不去也罢!