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

左丘成天
2023-12-01

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

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

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

  • 相关依赖
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
  • 完善配置
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

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

 类似资料: