Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥

这篇具有很好参考价值的文章主要介绍了Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 需求

Nacos中关于中间件的密码,还有第三方API的密钥等信息,都是明文存储,不符合系统安全要求。现需对这些信息进行加密处理,Nacos只存储密文,并在服务启动时,调用云厂商的KMS接口进行解密,将解密后的明文存储在内存中供服务后续使用。

2. 组件调研&增强

2.1. jasypt 组件

业界上已有jasypt组件可以很好地支持对配置文件中的敏感信息进行解密处理,并完全支持 Spring Boot 架构。但是唯一的缺点是,该组件默认仅支持一些核心的静态加解密算法,无法支持接入第三方KMS;并且,仅支持对一个完整配置项的解密处理,不支持对配置项中某段字符串进行解密操作。因此,不能直接使用在我们已有的服务上。

2.2. 增强

我们需对上述组件进行增强,主要是以下两点:

  1. 配置项部分解密:支持解密配置项中指定的某段字符串,使用ENC()CNE括住
  2. 第三方KMS解密:支持接入第三方KMS接口,对密文进行解密操作,支持将明文托管在KMS中(这里使用的是腾讯云的KMS)

我们不但要对jasypt组件进行增强,同时也需在此基础上再封装一个组件,用于整个平台的服务使用,避免冗余代码。

2.2.1. 引入相关依赖

核心是引入jasypt的 Spring Boot 组件,以及KMS(如腾讯云)组件:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <scope>provided</scope>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <scope>provided</scope>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
  </dependency>
  <dependency>
      <groupId>com.github.ulisesbocchio</groupId>
      <artifactId>jasypt-spring-boot</artifactId>
      <version>3.0.3</version>
  </dependency>
  <dependency>
      <groupId>com.tencentcloudapi</groupId>
      <artifactId>tencentcloud-sdk-java</artifactId>
      <version>3.1.927</version>
  </dependency>
  <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.16.0</version>
  </dependency>

2.2.2. 启动配置解密注解

此注解作为服务引入KMS加密的钥匙,加了才会启动KMS解密功能:

/**
 * 开启kms配置密文解密
 * @author winfun
 * @since 2023-12-18
 **/
@Inherited
@Component
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import({KmsConfig.class})
@EnableEncryptableProperties
public @interface EnableKmsPropertiesDecryption {
}

2.2.3. Kms配置类

主要包含上面提到的增强点:

  1. 增强Detector:用于识别ENC()CNE括住的密文
  2. 增强Encryptor:用于调用KMS的解密接口,返回解密后的明文供服务使用

需要注意的是,默认启用增强代码,如果我们需要临时关闭,可将配置项kms.enabled设置为false

/**
 * kms自动配置
 * @author howinfun
 * @since 2023/12/15
 */
@Slf4j
@Configuration
@EnableConfigurationProperties({KmsProperties.class})
@AutoConfigureBefore(EnableEncryptablePropertiesConfiguration.class)
@ConditionalOnProperty(name = "kms.enabled",havingValue = "true",matchIfMissing = true)
public class KmsConfig {

    private static final String prefix = "ENC(";
    private static final String suffix = ")CNE";

    @Bean
    public KmsClient kmsClient(KmsProperties kmsProperties) {
        Assert.notNull(kmsProperties.getSecretId(), "SecretId can't be null");
        Assert.notNull(kmsProperties.getSecretKey(), "SecretKey can't be null");
        Assert.notNull(kmsProperties.getRegion(), "Region can't be null");
        Credential cred = new Credential(kmsProperties.getSecretId(),kmsProperties.getSecretKey());
        // 实例化要请求产品的client对象,clientProfile是可选的
        return new KmsClient(cred, kmsProperties.getRegion());
    }

    /**
     * 自定义Detector,支持文本中带加密内容
     * @return EncryptablePropertyDetector
     */
    @Bean("encryptablePropertyDetector")
    public EncryptablePropertyDetector encryptablePropertyDetector() {

        return new EncryptablePropertyDetector() {

            @Override
            public boolean isEncrypted(String property) {
                if (property == null) {
                    return false;
                } else {
                    String trimmedValue = property.trim();
                    boolean isEncrypted = trimmedValue.contains(prefix) && trimmedValue.contains(suffix);
                    log.debug("收到配置:{},是否需要解密:{}",property,isEncrypted);
                    return isEncrypted;
                }
            }

            @Override
            public String unwrapEncryptedValue(String property) {
                return property;
            }
        };
    }

    /**
     * 自定义Encryptor,支持kms解密
     * @return StringEncryptor
     */
    @Bean("jasyptStringEncryptor")
    public StringEncryptor jasyptStringEncryptor(KmsClient kmsClient) {

        return new StringEncryptor() {

            @Override
            public String encrypt(String message) {
                return message;
            }

            @Override
            public String decrypt(String encryptedMessage) {
                try {
                    String trim = encryptedMessage.trim();
                    String encryptedMsg = trim.substring((trim.indexOf(prefix) + prefix.length()), trim.indexOf(suffix));
                    String prefixMsg = "";
                    String suffixMsg = "";
                    if (!trim.startsWith(prefix) || !trim.endsWith(suffix)) {
                        prefixMsg = trim.substring(0, trim.indexOf(prefix));
                        suffixMsg = trim.substring(trim.indexOf(suffix) + suffix.length());
                    }
                    DecryptRequest req = new DecryptRequest();
                    req.setCiphertextBlob(encryptedMsg);
                    DecryptResponse resp = kmsClient.Decrypt(req);
                    String pass = new String(Base64.decodeBase64(resp.getPlaintext()));
                    log.debug("密码解密成功,待处理密文:{},明文:{}", trim, pass);
                    return prefixMsg + pass + suffixMsg;
                } catch (Exception e) {
                    log.error("密文解密失败", e);
                }
                return encryptedMessage;
            }
        };
    }
}

2.3.4. Kms配置类

因为调用 KMS 接口,也是需要sk相关信息,但是这里有一个要注意的点,不要写在Nacos等配置中心中,而是以环境变量注入较好。

/**
 * kms配置
 * @author winfun
 * @since 2023/12/18
 **/
@Data
@ConfigurationProperties(prefix = "kms")
public class KmsProperties {

    private String secretId;
    private String secretKey;
    private String region;
}

3. 打包组件&使用

我们根据上述代码,可以打包成一个 Spring Boot 的 starter,供后续的所有服务使用。
下面拿我自己本地的作为例子看看:
1、引入KMS组件依赖:
Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥,Springboot,微服务架构,Kms,Spring
2、加入kms配置:
因为是本地启动调试,就直接先写在配置里头了
Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥,Springboot,微服务架构,Kms,Spring
3、明文密码替换为密文,并用ENC()CNE括住
Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥,Springboot,微服务架构,Kms,Spring
4、应用加入启动KMS解密注解:
Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥,Springboot,微服务架构,Kms,Spring
5、服务启动成功
Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥,Springboot,微服务架构,Kms,Spring文章来源地址https://www.toymoban.com/news/detail-816296.html

到了这里,关于Spring Boot 接入 KMS 托管中间件密码&第三方接口密钥的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • spring boot 项目中搭建 ElasticSearch 中间件 一 postman 操作 es

    作者: 逍遥Sean 简介:一个主修Java的Web网站游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 本文是ElasticSearch 的入门文章,包含ElasticSearch 的环境准备和基础操作(使用postman) Elas

    2024年02月11日
    浏览(8)
  • Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及与各中间件集成

    Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及与各中间件集成

    目录 前言 源码地址 官方中文文档 使用版本 spring Spring Boot 3.1.0 中间件 使用到的组件与功能 环境安装 虚拟机 nexus nacos 集成过程 工程搭建 父工程搭建 子工程 服务集成 nacos集成 配置文件 服务注册与发现-discovery 服务注册 启动 服务发现 测试 配置管理-config 新增配置  测试

    2024年02月07日
    浏览(13)
  • 基于 Docker 的 Spring Boot 项目部署演示,其中使用了 Redis、MySQL 和 RabbitMQ 中间件

    这是一个基于 Docker 的 Spring Boot 项目部署演示,其中使用了 Redis、MySQL 和 RabbitMQ 中间件。 拉取 MySQL 镜像: 创建 MySQL 容器: 将 密码 、 数据库名 、 用户名 和 密码 替换为您自己的值。 拉取 Redis 镜像: 创建 Redis 容器: 拉取 RabbitMQ 镜像: 创建 RabbitMQ 容器: 构建和运行

    2024年02月06日
    浏览(11)
  • Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及与各中间件集成
Sleuth+Zipkin集成分布式链路追踪

    Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及与各中间件集成 Sleuth+Zipkin集成分布式链路追踪

    目录 前言 源码地址 官方中文文档 使用版本 spring Spring Boot 3.1.0 中间件 使用到的组件与功能 环境安装 虚拟机 nexus nacos 集成过程 工程搭建 父工程搭建 子工程 服务集成 nacos集成 配置文件 服务注册与发现-discovery 服务注册 启动 服务发现 测试 配置管理-config 新增配置  测试

    2024年02月12日
    浏览(33)
  • [运维|中间件] 东方通TongWeb忘记密码后修改密码

    Tongweb忘记密码处理办法 以下步骤将thanos用户密码修改为 thanos123.com 编辑 twusers.properties 文件 将thanos的内容修改为默认的密码信息:

    2024年02月09日
    浏览(75)
  • Jasypt 数据库及中间件密码加解密

    9一、引入jar包 二、新增JasyptUtils工具类 三、修改application.yml 将加密后密码替换值yml文件ENC()括号内

    2024年02月13日
    浏览(6)
  • 【视频中间件】国标(GB28181)协议接入并输出标准FLV/RTSP/HLS流

    【视频中间件】国标(GB28181)协议接入并输出标准FLV/RTSP/HLS流

    在安防行业发展的今天,现目前很多企业单位均建设有视频管理平台,跨部门、跨系统的视频资源联网共享需求也越来越多,随着网络高速提升与发展,视频数据的互联互通共享也变得更加的便捷。目前视频平台互联最为常见的互通协议就是GB/T 28181,随着协议的不断完善及成

    2024年04月12日
    浏览(16)
  • 视频中间件:大华IPC/NVR 主动注册协议接入并输出标准FLV/RTSP/HLS流

    视频中间件:大华IPC/NVR 主动注册协议接入并输出标准FLV/RTSP/HLS流

    大华主动注册协议是类似海康E-home、ISUP协议,也是前端设备向中心平台和服务注册的一种主动注册协议,对于前端网络无固定IP情况下对视频的联网、视频上云等场景应用尤为适用。行业主动注册标准协议还有GB28181、JTT1078等,如何实现多协议的兼容适配,并输出标准化通用

    2024年02月12日
    浏览(11)
  • 【Spring Cloud】服务容错中间件Sentinel入门

    【Spring Cloud】服务容错中间件Sentinel入门

    欢迎来到阿Q社区 https://bbs.csdn.net/topics/617897123 Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于 服务容错 的综合性解决方案。它以流量为切入点,从 流量控制、熔断降级、系统负载保护 等多个维度来保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景 :

    2024年04月15日
    浏览(13)
  • 【Spring Cloud】服务容错中间件Sentinel进阶——五大规则

    【Spring Cloud】服务容错中间件Sentinel进阶——五大规则

    我们在上一篇文章中对 Sentinel 已经有了基本的了解,接下来,我们一起对它的进阶进行学习吧! 资源 所谓资源就是 Sentinel 要保护的东西,资源是 Sentinel 的关键概念。它可以是Java应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至可以是一段代码。 我们入门

    2024年04月26日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包