配置项加密包koca-crypto 导致压测性能问题

问题描述

在使用koca-crypto 2.6.0 之前的版本中,压测导致CPU利用率上不去。

根本原因

koca-crypto 使用 jasypto-spring-boot 实现配置项加密,koca 2.6.0 及之前版本试用的是 jasypto-spring-boot 3.0.3

在使用jasypt-spring-boot 3.0.3版本中,大量的Http请求都会触发publishRequestHandledEvent事件
RefreshScopeRefreshedEventListener恰好监听这类事件,如果如下两个类不存在的话,
ClassUtils.forName调用效率极低,一直处于BLOCKED状态

修复方案(二选一)

  • 1 koca-crypto升级到2.7.0 版本
  • 2 在工程的pom.xml中指定jasypto-spring-boot的版本号为 3.0.4 ,如下
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.4</version>
        </dependency>

特别说明

进行压测时,需要将koca 提供的bootapp的日志级别设置为ERROR, 具体操作如下:
找到 bootapp/src/resouces/logback-spring.xml 将

 <logger name="com.szkingdom" level="DEBUG"/>

修改为:

 <logger name="com.szkingdom" level="ERROR"/>
1 个赞
  • 配置加解密的功能已经在 Spring Cloud Commons 中实现,建议可切换到这个包。

  • 且 Spring Cloud Commons 使用的是 RSA 公钥加密,私钥解密,安全性更高。

  • jasypt-spring-boot-starter 基于 PBE 加密,对应的 jasypt 包已基本不维护。

  • Spring Cloud Commons 解密过程只存在于读取属性时,使用过程中属性值是明文,例如在 Config server 和 Config client 之间传输时,对于安全等级高的应用,建议使用 HTTPS。

  • 对于属性通过 toString()/configure 端口输出可能造成敏感配置泄漏的问题,Spring Boot 已处理一部分类似 passwordsecret 等关键字的敏感信息,其它的可能需要自定义,toString() 需要开发人员有防范意识。

Spring Boot 的配置无害化处理默认使用org.springframework.boot.actuate.endpoint.Sanitizer中的配置,如果要自定义,可以通过配置以下属性实现:

management:
  endpoint:
    configprops:
      keys-to-sanitize: ["password", "secret", "key", "token", ".*credentials.*", "vcap_services", "sun.java.command"]