美文网首页框架建设收集Spring bootJava框架
还将密码明文写在配置文件?试试 Jasypt Spring Bo

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

作者: ef6f9c30080a | 来源:发表于2019-07-25 12:28 被阅读254次

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

    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

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

    相关文章

      网友评论

        本文标题:还将密码明文写在配置文件?试试 Jasypt Spring Bo

        本文链接:https://www.haomeiwen.com/subject/jdjplctx.html