还将密码明文写在配置文件?试试 Jasypt Spring Boot

你是否还是这样,简单粗暴的把数据库用户名、密码等敏感信息写在配置文件中?那你又是否曾经考虑过其中的安全性问题?

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false
    username: root
    password: 123456

如果有的话,那下面来看看,如何通过使用 Jasypt Spring Boot ,以更加优雅的方式来规避这种操作。

  • 相关依赖
    
        
        
            com.github.ulisesbocchio
            jasypt-spring-boot-starter
            2.1.1
        

        
            org.springframework.boot
            spring-boot-starter-web
        
        
            mysql
            mysql-connector-java
            runtime
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        

        
            org.projectlombok
            lombok
            true
        
    
  • 完善配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&tinyInt1isBit=false
    # 对应用户名 root ,密码 123456
    username: ENC[KHRM9dKY8KykzzYbt8rRZQ==]
    password: ENC[RWmQMxlcukotJAb36PrKSA==]

jasypt:
  encryptor:
    # 任意的随机字符串均可
    password: SBPstLlrFzXW01Okb62R95qvpj4J83Dn
    property:
      # 自定义属性规则,默认前缀是“ENC(”,后缀为“)”
      prefix: "ENC["
      suffix: "]"

留意到上面这段配置的用户名和密码是 ENC[xxx] 这种格式的,其中 ENC[] 是自定义配置的,这也是 Jasypt 能正常识别待解密数据的规则,那其中的加密串又是从哪来的呢?

当然是运算出来的。最简单的配置,开发者只需要再补充完 jasypt.encryptor.password=xxx 属性即可(同上,还支持使用 DER、PEM 这种证书的 private/public keys 加解密方式),具体的生成代码在下方:

@Slf4j
@SpringBootApplication
@EnableEncryptableProperties
public class JasyptSpringBootApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context =
                SpringApplication.run(JasyptSpringBootApplication.class, args);
        JasyptSpringBootApplication application = context.getBean(JasyptSpringBootApplication.class);
        // 这里可以将明文(用户名、密码)转换成相应密文
        application.jasypt("root");
        application.jasypt("123456");

        // 不过程序最后还是通过明文信息进行数据库连接
        HikariDataSource hikariDataSource = (HikariDataSource) context.getBean(DataSource.class);
        log.info("DB username: {} , password: {}", hikariDataSource.getUsername(), hikariDataSource.getUsername());
    }

    @Resource
    private StringEncryptor stringEncryptor;

    public void jasypt(String text) {
        // 即使是相同明文,但这里每次生成的都是不同的密文
        String encryptedText = stringEncryptor.encrypt(text.trim());
        String decryptedText = stringEncryptor.decrypt(encryptedText);
        log.info("ORIGINAL: {} ; ENCRYPTED: {} ; DECRYPTED: {}", text, encryptedText, decryptedText);
    }

}

相关链接

jasypt-spring-boot
jasypt-spring-boot-samples

示例源码
欢迎关注我的个人公众号:超级码里奥
如果这对您有帮助,欢迎点赞和分享,转载请注明出处

你可能感兴趣的:(还将密码明文写在配置文件?试试 Jasypt Spring Boot)