当前位置:   article > 正文

SpringBoot 配置文件这样加密,才足够安全!_springboot配置文件密码加密

springboot配置文件密码加密

1. 前景

在使用Springboot时,通常很多信息都是在application.yml中直接明文配置的,比如数据库链接信息,redis链接信息等等。但是这样是不安全的。

所以需要对敏感数据进行加密,这样防止密码泄露

Jasypt这个库为我们解决了这个问题,实现了springboot配置的自定加密加密

2. 简单使用

源码对应地址:

gitlab.sea-clouds.cn/csdn/spring…

2.1 引入依赖

  1. <properties>
  2.     <maven.compiler.source>11</maven.compiler.source>
  3.     <maven.compiler.target>11</maven.compiler.target>
  4. </properties>
  5. <dependencyManagement>
  6.     <dependencies>
  7.         <dependency>
  8.             <groupId>org.springframework.boot</groupId>
  9.             <artifactId>spring-boot-dependencies</artifactId>
  10.             <version>2.4.0</version>
  11.             <type>pom</type>
  12.             <scope>import</scope>
  13.         </dependency>
  14.     </dependencies>
  15. </dependencyManagement>
  16. <dependencies>
  17.     <!-- web 和 测试 -->
  18.     <dependency>
  19.         <groupId>org.springframework.boot</groupId>
  20.         <artifactId>spring-boot-starter-web</artifactId>
  21.     </dependency>
  22.     <dependency>
  23.         <groupId>org.springframework.boot</groupId>
  24.         <artifactId>spring-boot-starter-test</artifactId>
  25.     </dependency>
  26.     <dependency>
  27.         <groupId>junit</groupId>
  28.         <artifactId>junit</artifactId>
  29.         <scope>test</scope>
  30.     </dependency>
  31.     <!-- jdbc -->
  32.     <dependency>
  33.         <groupId>org.springframework.boot</groupId>
  34.         <artifactId>spring-boot-starter-jdbc</artifactId>
  35.     </dependency>
  36.     <dependency>
  37.         <groupId>mysql</groupId>
  38.         <artifactId>mysql-connector-java</artifactId>
  39.     </dependency>
  40.     <!-- jasypt 加密 -->
  41.     <dependency>
  42.         <groupId>com.github.ulisesbocchio</groupId>
  43.         <artifactId>jasypt-spring-boot-starter</artifactId>
  44.         <version>3.0.3</version>
  45.     </dependency>
  46.     <dependency>
  47.         <groupId>org.projectlombok</groupId>
  48.         <artifactId>lombok</artifactId>
  49.     </dependency>
  50. </dependencies>
  51. 复制代码

2.2 配置application信息

jasypt配置

  1. jasypt:
  2.   encryptor:
  3.     # 加密算法
  4.     algorithm: PBEWITHHMACSHA512ANDAES_256
  5.     # 加密使用的盐
  6.     password: jaspyt_password
  7. 复制代码

2.3 加密解密测试

  1. /**
  2.  * @author HLH
  3.  * @description: 加密解密测试
  4.  */
  5. @SpringBootTest
  6. @RunWith(SpringRunner.class)
  7. public class JasyptTest {
  8.     @Autowired
  9.     private StringEncryptor stringEncryptor;
  10.     /**
  11.      * 加密解密测试
  12.      */
  13.     @Test
  14.     public void jasyptTest() {
  15.         // 加密
  16.         System.out.println(stringEncryptor.encrypt("root"));    // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
  17.         // 解密
  18.         System.out.println(stringEncryptor.decrypt("JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg"));    // root
  19.     }
  20.     /**
  21.      * 手动测试
  22.      */
  23.     @Test
  24.     public void test() {
  25.         PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
  26.         SimpleStringPBEConfig config = new SimpleStringPBEConfig();
  27.         config.setPassword("jaspyt_password");
  28.         config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
  29.         config.setKeyObtentionIterations("1000");
  30.         config.setPoolSize("1");
  31.         config.setProviderName("SunJCE");
  32.         config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
  33.         config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
  34.         config.setStringOutputType("base64");
  35.         encryptor.setConfig(config);
  36.         System.out.println(encryptor.encrypt("root"));    // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
  37.     }
  38. }
  39. 复制代码

3. 使用Jasypt加密后的字符串代替数据库密码

3.1 使用加密类进行加密

密码 root 加密之后 XjYnpGd3JGICnxumpFcfRP8J83m265yC/r1FiwLr9Yo1PNbPXQ2xykLHPpy02CZ1

  1. /**
  2.  * 数据库密码加密
  3.  */
  4. @Test
  5. public void encryptPasswored() {
  6.     // 加密
  7.     System.out.println(stringEncryptor.encrypt("root"));    // XjYnpGd3JGICnxumpFcfRP8J83m265yC/r1FiwLr9Yo1PNbPXQ2xykLHPpy02CZ1
  8.     // 解密
  9.     System.out.println(stringEncryptor.decrypt("XjYnpGd3JGICnxumpFcfRP8J83m265yC/r1FiwLr9Yo1PNbPXQ2xykLHPpy02CZ1"));    // root
  10. }
  11. 复制代码

3.2 替换数据库配置

  1. spring:
  2.   datasource:
  3.     driver-class-name: com.mysql.cj.jdbc.Driver
  4.     url: jdbc:mysql://192.168.10.31/mp
  5.     username: root
  6.     # 使用ENC()包裹,标识为加密之后的,否则无法解密,会报错
  7.     password: ENC(R2H69h1aEgJ3EDPLXAVQ5CxZJWtl8EvqIJUtlATRt6om4w46/J+blu2JAvkR7Yvp)
  8. 复制代码

3.3 测试

  1. @Autowired
  2. private DataSource dataSource;
  3. /**
  4.  * 测试加密之后的数据源使用是否正常
  5.  *  查看是否能正常获取链接
  6.  */
  7. @Test
  8. public void datasourceTest() throws SQLException {
  9.     Connection connection = dataSource.getConnection();
  10.     System.out.println(connection);     // HikariProxyConnection@1487059223 wrapping com.mysql.cj.jdbc.ConnectionImpl@48904d5a
  11.     connection.close();
  12. }
  13. 复制代码

4. Jasypt配置详解

所有配置都在JasyptEncryptorConfigurationProperties类中定义,我们只需要在yml中配置属性,即可达到重写的目的

Jasypt使用StringEncryptor来解密属性。如果Spring上下文中找不到自定义的StringEncryptor,就会自动创建一个,可以通过以下属性进行配置

唯一需要的属性是加密的盐,其余的可以使用默认值。虽然所有这些属性都可以在属性文件中生命,但加密所使用的盐不应该存储在属性文件中,而是应该通过系统属性、命令行参数或者环境变量传递,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/984643
推荐阅读
相关标签
  

闽ICP备14008679号