SpringBoot整合jasypt实现敏感信息的加密详解
作者:不懂一休
一般公司的核心业务代码中,都会存在与数据库、第三方通信的secret key等敏感信息,如果以明文的方式存储,一旦泄露,那将会给公司带来巨大的损失。本篇文章通过讲解:Springboot集成Jasypt对项目敏感信息进行加密,提高系统的安全性
一、简介
在后端开发中有很多敏感信息,比如数据库用户名密码,第三方 Apikey,云服务商的 secretKey 等、如果不希望用明文在 application.yml 配置的,可以使用 jasypt 加密这些字段。
还有很重要的一点,如果你自己开源一些东西,将代码上传一些代码托管平台,肯定需要隐藏敏感信息,用 jasypt 加密可以简化每次上传下拉代码修改敏感信息。
官方文档, 官方文档使用方法描述得很清楚适用于各种情况,下面我简单记录一下加密 MySQL 用户名密码方法
二、导入依赖
<dependencies> <!-- jasypt 敏感数据加密,如:数据库密码,阿里云短信服务等--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> <scope>runtime</scope> </dependency> <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <!-- springboot 启动包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
三、加密字段工具类
加密 mysql 用户名密码,将用户名密码传入 fields 数组,保存打印结果下面配置在 application.yaml 文件
public class JasyptUtil { private static PooledPBEStringEncryptor encryptor; static{ encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("This is a secret key"); // 秘钥 config.setAlgorithm("PBEWithMD5AndDES"); //config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); } public static void main(String[] args) { // 需要加密的字段 String[] fields = {"root","123456"}; for (String field : fields) { System.out.println(field+"---->"+encryptorField(field)); } } public static String encryptorField(String field){ return encryptor.encrypt(field); } public static String decryptField(String field){ return encryptor.decrypt(field); } }
可以看到加密过后的字符串如下
四、application.yaml 配置
数据源用户名密码使用上面生成加密字段
spring: datasource: username: ENC(J5GOvO1FBgtiwEytIjU/4WdzHUgbJq/W) password: ENC(SqCHgntWcYnthvtWGA3+GAycDle/qCBx) driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/oauth?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 # jasypt 敏感数据加密配置 # 详细用法可参考 https://github.com/ulisesbocchio/jasypt-spring-boot jasypt: encryptor: password: 123456 # 秘钥,除了该项,下面都是默认值,该项建议设置 JVM 启动参数,如:-Djasypt.encryptor.password=123456 algorithm: PBEWithMD5AndDES # 加密算法 key-obtention-iterations: 1000 # 迭代次数,值越大越复杂,相对越安全 pool-size: 1 provider-name: SunJCE salt-generator-classname: org.jasypt.salt.RandomSaltGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator string-output-type: base64 proxy-property-sources: false property: prefix: ENC( # 默认前缀 suffix: ) # 默认后缀
五、启动类测试
查询 MySQL 的 user 表打印用户名和密码
package com.ye; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @SpringBootApplication public class Test2Application { public static void main(String[] args) throws SQLException { ConfigurableApplicationContext context = SpringApplication.run(Test2Application.class, args); DataSource dataSource = (DataSource) context.getBean("dataSource"); Connection connection = dataSource.getConnection(); try { PreparedStatement ps = connection.prepareStatement("select * from user;"); ResultSet rs = ps.executeQuery(); System.out.println("<---------- user 表数据 ----------->"); while (rs.next()) { String userName = rs.getString("user_name"); String password = rs.getString("password"); System.out.printf("userName: %s, password: %s%n", userName, password); } } catch (SQLException ex) { ex.printStackTrace(); connection.close(); } } }
点击 Edit Configurations ,添加VM 启动参数 -Djasypt.encryptor.password="This is a secret key"
,这个密码和加密工具类 JasyptUtil 密码保持一致
运行成功打印结果如下
经过上面的操作,我们已经将敏感信息加密
到此这篇关于SpringBoot整合jasypt实现敏感信息的加密详解的文章就介绍到这了,更多相关SpringBoot敏感信息加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- springboot使用jasypt对配置文件加密加密数据库连接的操作代码
- SpringBoot整合Jasypt实现配置加密的步骤详解
- Springboot集成Jasypt实现配置文件加密的方法
- 微服务SpringBoot整合Jasypt加密工具的场景分析
- SpringBoot集成Jasypt敏感信息加密的操作方法
- springboot 项目使用jasypt加密数据源的方法
- Jasypt对SpringBoot配置文件加密
- jasypt 集成SpringBoot 数据库密码加密操作
- SpringBoot 集成 Jasypt 对数据库加密以及踩坑的记录分享
- 基于Jasypt对SpringBoot配置文件加密
- 在SpringBoot中通过jasypt进行加密解密的方法
- SpringBoot使用Jasypt对配置文件和数据库密码加密