赞
踩
在使用Springboot时,通常很多信息都是在application.yml中直接明文配置的,比如数据库链接信息,redis链接信息等等。但是这样是不安全的。
所以需要对敏感数据进行加密,这样防止密码泄露
Jasypt这个库为我们解决了这个问题,实现了springboot配置的自定加密加密
源码对应地址:
- <properties>
- <maven.compiler.source>11</maven.compiler.source>
- <maven.compiler.target>11</maven.compiler.target>
- </properties>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-dependencies</artifactId>
- <version>2.4.0</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <!-- web 和 测试 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <!-- jdbc -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
-
- <!-- jasypt 加密 -->
- <dependency>
- <groupId>com.github.ulisesbocchio</groupId>
- <artifactId>jasypt-spring-boot-starter</artifactId>
- <version>3.0.3</version>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- </dependencies>
- 复制代码
jasypt配置
- jasypt:
- encryptor:
- # 加密算法
- algorithm: PBEWITHHMACSHA512ANDAES_256
- # 加密使用的盐
- password: jaspyt_password
- 复制代码
- /**
- * @author HLH
- * @description: 加密解密测试
- */
- @SpringBootTest
- @RunWith(SpringRunner.class)
- public class JasyptTest {
-
- @Autowired
- private StringEncryptor stringEncryptor;
-
- /**
- * 加密解密测试
- */
- @Test
- public void jasyptTest() {
- // 加密
- System.out.println(stringEncryptor.encrypt("root")); // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
- // 解密
- System.out.println(stringEncryptor.decrypt("JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg")); // root
- }
-
- /**
- * 手动测试
- */
- @Test
- public void test() {
- PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
- SimpleStringPBEConfig config = new SimpleStringPBEConfig();
- config.setPassword("jaspyt_password");
- 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);
- System.out.println(encryptor.encrypt("root")); // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
- }
-
- }
- 复制代码
密码 root 加密之后 XjYnpGd3JGICnxumpFcfRP8J83m265yC/r1FiwLr9Yo1PNbPXQ2xykLHPpy02CZ1
- /**
- * 数据库密码加密
- */
- @Test
- public void encryptPasswored() {
- // 加密
- System.out.println(stringEncryptor.encrypt("root")); // XjYnpGd3JGICnxumpFcfRP8J83m265yC/r1FiwLr9Yo1PNbPXQ2xykLHPpy02CZ1
- // 解密
- System.out.println(stringEncryptor.decrypt("XjYnpGd3JGICnxumpFcfRP8J83m265yC/r1FiwLr9Yo1PNbPXQ2xykLHPpy02CZ1")); // root
- }
- 复制代码
- spring:
- datasource:
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://192.168.10.31/mp
- username: root
- # 使用ENC()包裹,标识为加密之后的,否则无法解密,会报错
- password: ENC(R2H69h1aEgJ3EDPLXAVQ5CxZJWtl8EvqIJUtlATRt6om4w46/J+blu2JAvkR7Yvp)
- 复制代码
- @Autowired
- private DataSource dataSource;
- /**
- * 测试加密之后的数据源使用是否正常
- * 查看是否能正常获取链接
- */
- @Test
- public void datasourceTest() throws SQLException {
- Connection connection = dataSource.getConnection();
- System.out.println(connection); // HikariProxyConnection@1487059223 wrapping com.mysql.cj.jdbc.ConnectionImpl@48904d5a
- connection.close();
- }
- 复制代码
所有配置都在JasyptEncryptorConfigurationProperties
类中定义,我们只需要在yml中配置属性,即可达到重写的目的
Jasypt使用StringEncryptor
来解密属性。如果Spring上下文中找不到自定义的StringEncryptor
,就会自动创建一个,可以通过以下属性进行配置
唯一需要的属性是加密的盐,其余的可以使用默认值。虽然所有这些属性都可以在属性文件中生命,但加密所使用的盐不应该存储在属性文件中,而是应该通过系统属性、命令行参数或者环境变量传递,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。