当前位置: 首页 > article >正文

Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)

阿里云的KMS(Key Management Service)也是一种托管式密钥管理服务,帮助用户安全地创建、控制和使用密钥,保护敏感数据。通过使用KSM,您可以专注于构建和优化应用程序,而不必担心密钥管理的复杂性。

1、主要功能

  1. 密钥托管:支持多种类型的对称和非对称加密密钥的创建,并提供安全的密钥存储。
    包括密钥的创建、启用、禁用、计划删除等操作,确保密钥在其整个生命周期内的安全性和有效性。
  2. 数据加密:提供加密、解密、签名验签等密码学操作。
  3. 严格的访问控制:集成阿里云RAM(Resource Access Management),可以为不同的用户或角色设置细粒度的权限控制。
  4. 审计跟踪:记录所有与密钥相关的操作,如创建、删除、启用/禁用等,以供审计之用。
  5. 合规性认证:满足多项国际和地区的安全标准和法规要求,如ISO 27001、CSA STAR等。

2、使用场景

  • 数据加密:可用于加密静态数据,如数据库中的敏感信息、备份文件等,确保数据的安全性。
  • 应用层加密:开发者可以在应用层面使用KMS提供的API进行数据加密解密操作,提高数据处理过程中的安全性。
  • 密钥轮换:自动或手动更新加密密钥,降低长期使用同一密钥带来的风险。

3、安全措施

  • 硬件安全模块(HSM)保护:阿里云KMS使用经过验证的硬件安全模块来保护您的密钥,确保其存储和使用的安全性。
  • 多因素认证(MFA):增强对关键操作的保护,防止未经授权的访问。
  • 网络隔离:KMS运行于阿里云的高安全等级环境中,确保服务之间的网络隔离,减少潜在的安全威胁。

4、密钥类型

阿里云 KMS 提供三种密钥类型,适用于不同场景:

(1)、默认密钥(Default Key)

  • 特点:
    • 免费:无需额外付费,用户开通 KMS 即可使用。
    • 功能限制:仅支持云产品服务端加密(如 ECS、RDS 等),不支持客户端数据加密。
    • 密钥类型:对称密钥(AES-256)。
  • 适用场景:
    • 云产品(如 RDS、OSS)的服务端加密,无需用户管理密钥,由云产品自动使用默认密钥加密数据。

(2)、软件密钥(Software Key)

  • 特点:
    • 托管在阿里云服务器:密钥存储在软件加密服务中,成本较低。
    • 功能丰富:
      • 支持客户端数据加密(如应用层数据加密)。
      • 支持密钥轮换(自动更新密钥,降低泄露风险)。
      • 支持对称密钥(如 AES-256)和非对称密钥(如 RSA、ECC)。
    • 合规性:符合中国等保 2.0 标准。
  • 适用场景:
    • 应用层数据加密:如加密数据库密码、API 密钥等敏感信息。
    • 云产品服务端加密:如 RDS、OSS 的加密存储。

(3)、硬件密钥(Hardware Security Module, HSM)

  • 特点:
    • 物理安全隔离:密钥存储在 FIPS 140-2 Level 3 认证的硬件安全模块中,安全性最高,费用最高。
    • 合规性:满足金融、医疗等高安全要求场景的合规需求(如 GDPR、PCI DSS)。
    • 功能限制:
      • 不支持密钥轮换:需手动操作。
      • 支持更多密钥规格:如国密 SM2/SM4 算法。
    • 计费:按实例和 QPS 计费,成本较高。
  • 适用场景:
    • 高安全场景:如金融行业的敏感数据加密、数字签名。
    • 合规要求严格:需符合国际或国内安全标准。

5、阿里云平台配置

(1)、创建阿里云KMS密钥

  1. 登录阿里云控制台:
    • 访问阿里云官网,登录账号。
  2. 进入KMS控制台:
    • 导航到 产品与服务 → 安全 → 密钥管理服务(KMS)。
  3. 创建密钥:
    • 点击 创建密钥 → 选择 对称密钥(默认AES-256)。
    • 填写密钥别名(如 my-springboot-key),选择地域(如华东1)。
    • 点击 立即创建,完成密钥创建。
  4. 记录密钥ID:
    • 进入密钥详情页,复制密钥ID(Key ID),后续代码中需要用到。

(2)、配置RAM权限

  1. 创建RAM用户(可选但推荐):
    • 进入 RAM控制台 → 用户 → 创建用户,赋予用户 KMS权限。
    • 授予策略:AliyunKMSFullAccess(全权限)或自定义策略(如仅允许加密/解密操作)。
  2. 关联密钥权限:
    • 在KMS控制台,进入密钥详情页 → 权限策略 → 添加RAM用户权限。

(3)、获取AccessKey

  1. 获取AccessKey:
    • 点击右上角头像 → 访问控制RAM → AccessKey管理。
    • 点击 创建AccessKey,保存生成的 AccessKey ID 和 AccessKey Secret(注意:AccessKey Secret仅显示一次,需妥善保存)。

说明:
秘钥Id(Key ID)为秘钥的value对应的key。这个用于获取加密秘钥。
AccessKey ID 和 AccessKey Secret为接入权限的认证信息,标识用户身份。

6、代码示例

(1)、添加依赖
在 pom.xml 中添加阿里云KMS SDK依赖:
示例:

<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-kms</artifactId><version>6.2.0</version> <!-- 请使用最新版本 -->
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.10.2</version>
</dependency>

(2)、配置参数

在 application.yml 中配置阿里云KMS参数:
示例:

aliyun:kms:access-key-id: "your-access-key-id"        # 步骤2中获取的AccessKey IDaccess-key-secret: "your-access-key-secret"  # 步骤2中获取的AccessKey Secretregion: "cn-hangzhou"                      # 地域(如华东1对应cn-hangzhou)key-id: "your-kms-key-id"                  # 步骤1中创建的密钥ID

(3)、创建KMS配置类

创建一个配置类,初始化KMS客户端:
示例:

import com.aliyun.kms.model.*;
import com.aliyun.kms.profile.DefaultProfile;
import com.aliyun.kms.profile.IClientProfile;
import com.aliyun.kms.transform.KmsDefaultAcsClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class KmsConfig {@Value("${aliyun.kms.access-key-id}")private String accessKeyId;@Value("${aliyun.kms.access-key-secret}")private String accessKeySecret;@Value("${aliyun.kms.region}")private String regionId;@Beanpublic KmsDefaultAcsClient kmsClient() {IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);return new KmsDefaultAcsClient(profile);}
}

(4)、编写KMS工具类

创建工具类实现加密和解密功能:
示例:

import com.aliyun.kms.model.EncryptRequest;
import com.aliyun.kms.model.EncryptResponse;
import com.aliyun.kms.model.DecryptRequest;
import com.aliyun.kms.model.DecryptResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;@Component
public class KmsUtil {@Resourceprivate KmsDefaultAcsClient kmsClient;@Value("${aliyun.kms.key-id}")private String keyId;/* 加密数据* @param plaintext 明文数据* @return 加密后的密文*/public String encrypt(String plaintext) {try {EncryptRequest request = new EncryptRequest();request.setKeyId(keyId);request.setPlaintext(plaintext.getBytes());EncryptResponse response = kmsClient.getAcsResponse(request);return response.getCiphertextBlob(); // 返回Base64编码的密文} catch (Exception e) {throw new RuntimeException("加密失败", e);}}/* 解密数据* @param ciphertext 密文(Base64编码)* @return 明文数据*/public String decrypt(String ciphertext) {try {DecryptRequest request = new DecryptRequest();request.setCiphertextBlob(ciphertext);DecryptResponse response = kmsClient.getAcsResponse(request);return new String(response.getPlaintext());} catch (Exception e) {throw new RuntimeException("解密失败", e);}}
}

(5)、使用示例

在Controller或Service中调用加密/解密方法。
示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class KmsController {@Autowiredprivate KmsUtil kmsUtil;@GetMapping("/encrypt")public String encrypt(@RequestParam String text) {String encrypted = kmsUtil.encrypt(text);return "加密结果: " + encrypted;}@GetMapping("/decrypt")public String decrypt(@RequestParam String cipherText) {String decrypted = kmsUtil.decrypt(cipherText);return "解密结果: " + decrypted;}
}

注意:
以上的编码为仅为使用示例,在实际开发过程中还需要注意一些其他情况。
1. 安全建议:

  • AccessKey管理:避免将AccessKey硬编码在代码中,可使用环境变量或配置中心(如Nacos),或独立文件中,在读取文件获取等。
  • 密钥权限:仅给RAM用户分配最小必要权限(如 AliyunKMSCryptoUserAccess)。
    2. 地域匹配:
  • 确保 region 配置与KMS密钥所在的地域一致(如 cn-hangzhou 对应华东1)。
    3. 异常处理:
  • 在实际项目中,需对 KmsClient 的调用添加重试机制和异常捕获。

7、秘钥轮换注意

为了降低长期使用同一密钥带来的风险,自动或手动更新加密密钥在大厂实践中是必须的。
可以在阿里云KMS中配置每 90 天轮换一次密钥,或结合需要自行设置。

解决方法:

(1)、保留旧版本密钥(不推荐)

  • 在 KMS 中,即使密钥轮换了,旧版本的密钥仍然可以用于解密历史数据。
  • 确保不要删除旧版本的 CMK。
    解释:
    新数据使用新的秘钥进行加密和解密。历史版本数据需要获取历史版本的CMK秘钥进行解密。这种方案需要业务上处理秘钥的版本或KMS支持自动解析才能实现。通常不推荐

(2)、数据重新加密(大数据时不推荐)

  • 如果你需要更高的安全性,可以在密钥轮换后重新加密所有数据。
  • 这可以通过以下步骤实现:
    1. 使用旧版本密钥解密所有数据。
    2. 使用新版本密钥重新加密数据。
      解释:
      历史数据都需要重新通过旧秘钥解密,在按照新秘钥重新加密。这样能保证所有的数据都可以使用新秘钥进行处理。这种方式对于数据少的情况还行,数据量巨大的场景并不适用。

(3)、数据密钥(DEK)与主密钥(CMK)结合(推荐)

  • 使用阿里云生成的主密钥CMK对数据秘钥DEK进行加密,将加密后的DEK存储到客户程序中。
  • 客户程序通过CMK对DEK进行解密后,在加密数据。
  • CMK秘钥轮换后,对DEK解密后重新加密(KMS有API),这样仅对数据秘钥DEK进行了重新加密,数据就无需重新处理。

8、阿里云KMS对比AWS KMS

阿里云KMS(Key Management Service)和AWS KMS(Key Management Service)都是提供密钥管理服务的云产品,旨在帮助用户安全地创建、存储和管理加密密钥。两者都提供了强大的功能来保护数据的安全性。

(1)、密钥管理

  • 阿里云KMS:支持对称密钥和非对称密钥的生成、导入和管理。它还允许用户通过硬件安全模块(HSM)来增强密钥的安全性。
  • AWS KMS:同样支持对称密钥和非对称密钥的管理,并且也使用了HSM来保护密钥材料。此外,AWS KMS还提供了更高级的功能,比如自定义密钥存储(Custom Key Store),它允许用户将密钥存储在自己的AWS CloudHSM集群中。

(2)、访问控制

  • 阿里云KMS:集成阿里云RAM(Resource Access Management)系统,可以为不同的用户或角色设置细粒度的权限控制。
  • AWS KMS:利用IAM(Identity and Access Management)策略来控制谁可以访问哪些密钥以及他们可以执行的操作类型。

(3)、审计与监控

  • 阿里云KMS:记录所有与密钥相关的操作日志,并且这些日志可以通过阿里云的日志服务进行分析。
  • AWS KMS:集成了CloudTrail服务,能够记录所有API调用,包括谁调用了哪个密钥以及何时调用等信息。

(4)、加密解密能力

  • 阿里云KMS:可以直接通过API进行加密解密操作,同时也支持与其他阿里云服务(如OSS, RDS等)集成以自动处理加密需求。
  • AWS KMS:不仅提供直接的加密解密API,还可以与S3, EBS, Redshift等多种AWS服务无缝集成,使得数据在传输和静态时都能得到保护。

(5)、合规性

  • 阿里云KMS:符合多项国际标准,例如ISO 27001、CSA STAR等。
  • AWS KMS:除了满足上述标准外,还符合HIPAA、FedRAMP等特定行业的要求。

(6)、成本模型

  • 阿里云KMS:按照请求次数收费,同时对于密钥的创建、启用/禁用、计划删除等操作也有相应的费用。
  • AWS KMS:采用类似的按请求次数计费模式,但具体费率可能有所不同。AWS还提供预留密钥选项,可以帮助客户节省长期使用的成本。

(7)、地理位置和服务可用性

  • 阿里云KMS:主要服务于中国市场,但在全球范围内也有数据中心。
  • AWS KMS:在全球多个区域提供服务,适合需要跨国界运营的企业。

(8)、对比总结

建议在中国境内或国产项目使用阿里云KMS。在境外区域使用AWS可能比较合适。

  • 阿里云KMS:

    • 优势:中国境内低延迟、合规性强(等保2.0、国密算法)、成本低。
    • 局限:全球覆盖有限,国际合规认证(如GDPR)需额外配置。
  • AWS KMS:

    • 优势:全球覆盖、高可用性、丰富的集成生态、国际合规认证。
    • 局限:中国境内访问可能受网络限制,成本较高。

逆风翻盘,Dare To Be!!!

相关文章:

Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)

阿里云的KMS&#xff08;Key Management Service&#xff09;也是一种托管式密钥管理服务&#xff0c;帮助用户安全地创建、控制和使用密钥&#xff0c;保护敏感数据。通过使用KSM&#xff0c;您可以专注于构建和优化应用程序&#xff0c;而不必担心密钥管理的复杂性。 1、主要…...

基于STM32 的实时FFT处理(Matlab+MDK5)

目录 一、 任务介绍二、基本原理三、软件仿真3.1 软件仿真基本原理3.2 软件仿真序列的软件模拟 四、模拟测试五、 附加题六、 源码 一、 任务介绍 1、在硬件平台上实现 FFT 算法&#xff1b; 2、模拟数据&#xff0c;通过 FFT 算法进行谱分析&#xff1b; 3、测定 PWM 输出方波…...

RVOS-3.实现内存管理

3.内存管理 3.1 实验目的 对内存进一步的管理&#xff0c;实现动态的分配和释放。 实现 Page 级别的内存分配和释放。 在 page 分配的基础上实现更细颗粒度的&#xff0c;精确到字节为单位的内存管理。 &#xff08;练习8.1&#xff09; void *malloc(size_t size); void fr…...

MySQL 约束(入门版)

目录 一、约束的基本概念 二、约束演示 三、外键约束 &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;外键约束语法 &#xff08;三&#xff09;删除/更新行为 一、约束的基本概念 1、概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储…...

系统与网络安全------Windows系统安全(11)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 制作U启动盘 U启动程序 下载制作U启程序 Ventoy是一个制作可启动U盘的开源工具&#xff0c;只需要把ISO等类型的文件拷贝到U盘里面就可以启动了 同时支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…...

电容命名解析与多类型电容的必要性

一、电容命名&#xff1a;NP0、COG及其他类型 1. NP0与COG的命名与识别 COG&#xff08;EIA标准&#xff09;&#xff1a; 命名规则&#xff1a; C&#xff1a;温度系数 0 ppm/℃&#xff08;Class I介质&#xff09; O&#xff1a;容值偏差 30 ppm/℃ G&#xff1a;温度范围…...

重返JAVA之路-初识JAVA

目录 1.什么是JDK? 2.什么是JRE? 3.什么是JVM? 4.JDK&#xff0c;JRE&#xff0c;JAM之间的关系是怎么样的&#xff1f; 5.什么是驼峰命名法&#xff1f; 1.什么是JDK? JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java 开发工具包&#xff0c;是 Jav…...

封装公共方法,并存在异步请求接口情况 封装及调用

**封装公共方法&#xff0c;并存在异步请求接口情况 ** utilsTwo/login.js文件夹下 封装代码如下&#xff1a; // 扫一扫加入班组 export async function sweep(parameter) {// console.log("登录信息", userInfo)return await new Promise(function(resolve, reje…...

蓝桥杯 小蓝的操作(一维差分)

问题描述 一个数组 aa 中共包含 nn 个数&#xff0c;问最少多少次操作&#xff0c;可以让 aa 数组所有数都变成 11 。 操作的内容是&#xff1a;每次操作可以任选一个区间使得区间内的所有数字减 11 。 数据保证一定有解。 输入格式 第一行一个整数 nn 表示有 nn 个整数。 …...

训练数据清洗(文本/音频/视频)

多数据格式的清洗方法 以下是针对多数据格式清洗方法的系统性总结&#xff0c;结合Python代码示例&#xff1a; 一、数据清洗方法总览&#xff08;表格对比&#xff09; 数据类型核心挑战关键步骤常用Python工具文本非结构化噪声去噪→分词→标准化→向量化NLTK, SpaCy, Jie…...

LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 字符集转码/字符集探测

LIB-ZC, 一个跨平台(Linux)平台通用C/C扩展库, 字符集转码/字符集探测 字符集DNS/IP相关的方法: 主要是为了解决跨平台的问题其次对一些常见操作做了封装命名空间: zcc::charset 常用变量 const char *chinese[] {"UTF-8", "GB18030", "BIG5&quo…...

阿里云服务迁移实战: 02-服务器迁移

ECS 迁移 最简单的方式是 ECS 过户&#xff0c;不过这里有一些限制&#xff0c;如果原账号是个人账号&#xff0c;那么目标账号无限制。如果原账号是企业账号&#xff0c;则指定过户给相同实名认证的企业账号。 具体操作步骤可以参考官方文档 ECS过户 进行操作。 本文重点介绍…...

cat命令查看文件行数

在Linux和Unix-like操作系统中&#xff0c;cat命令主要用于查看文件内容&#xff0c;而不是直接用来查看文件行数。如果你想要查看一个文件的行数&#xff0c;可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用wc命令 wc&#xff08;word count&#xff09;命令可以用…...

7# 5多线-7 不会停

7# 5多线-7 不会停 分析&#xff0c;明显线接错了&#xff0c;打自动时也能手动启停&#xff0c;打手动无法启停&#xff0c;这时远程只能启ka3,无法启ka4。排查手自转换2上没接线&#xff0c;接到8上了&#xff08;13和12接错了&#xff0c;也就是sac的5和6接错了&#xff09;…...

【AI编程技术爆发:从辅助工具到生产力革命】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比&#xff08;2023年数据&#xff09;结果分析 四、最…...

protobuf的应用

1.版本和引用 syntax "proto3"; // proto2 package tutorial; // package类似C命名空间 // 可以引用本地的&#xff0c;也可以引用include里面的 import "google/protobuf/timestamp.proto"; // 已经写好的proto文件是可以引用 我们版本选择pr…...

C++字符串操作详解

引言 字符串处理是编程中最常见的任务之一&#xff0c;而在C中&#xff0c;我们有多种处理字符串的方式。本文将详细介绍C中的字符串操作&#xff0c;包括C风格字符串和C的string类。无论你是C新手还是想巩固基础的老手&#xff0c;这篇文章都能帮你梳理字符串处理的关键知识点…...

原理图设计准备:页面栅格模板应用设置

一、页面大小的设置 &#xff08;1&#xff09;单页原理图页面设置 首先&#xff0c;选中需要更改页面尺寸的那一页原理图&#xff0c;鼠标右键&#xff0c;选择“Schmatic Page Properties”选项&#xff0c;进行页面大小设置。 &#xff08;2&#xff09;对整个原理图页面设…...

MySQL 的四种社交障碍等级

在数据库的世界里&#xff0c;数据们也有社交问题&#xff01;事务隔离级别就是控制它们互相看到对方的程度... 什么是事务隔离&#xff1f;&#x1f914; 想象一下&#xff0c;数据库是一个繁忙的餐厅&#xff0c;每个事务都是一桌客人&#xff0c;而数据就是美食。事务隔离…...

100道C++ 高频经典面试题带解析答案

100道C 高频经典面试题带解析答案 C作为一种功能强大且广泛应用的编程语言&#xff0c;在技术面试中经常被考察。掌握高频经典面试题不仅能帮助求职者自信应对面试&#xff0c;还能深入理解C的核心概念。以下整理了100道高频经典C面试题&#xff0c;涵盖基础知识、数据结构、面…...

vue实现中英文切换

第一步&#xff1a;安装插件vue-i18n&#xff0c;npm install vue-i18n 第二步&#xff1a;在src下新建locales文件夹&#xff0c;并在locales下新建index.js、EN.js、CN.js文件 第三步&#xff1a;在EN.js和CN.js文件下配置你想要的字段&#xff0c;例如&#xff1a; //CN.js…...

day31-贪心__56. 合并区间__ 738.单调递增的数字__968.监控二叉树 (可跳过)

56. 合并区间 合并区间&#xff0c;这道题和昨天的452. 用最少数量的箭引爆气球和435. 无重叠区间 也是类似的思路&#xff0c;我们需要先对所有vector按照左端点或者右端点进行排序。本题按照左端点进行排序。之后&#xff0c;如果前一段的右端点<后一段的左端&#xff0c…...

【antd + vue】Modal 对话框:修改弹窗标题样式、Modal.confirm自定义使用

一、标题样式 1、目标样式&#xff1a;修改弹窗标题样式 2、问题&#xff1a; 直接在对应css文件中修改样式不生效。 3、原因分析&#xff1a; 可能原因&#xff1a; 选择器权重不够&#xff0c;把在控制台找到的选择器直接复制下来&#xff0c;如果还不够就再加&#xff…...

Gson、Fastjson 和 Jackson 对比解析

目录 1. Gson (Google) 基本介绍&#xff1a; 核心功能&#xff1a; 特点&#xff1a; 使用场景&#xff1a; 2. Fastjson (Alibaba) 基本介绍&#xff1a; 核心功能&#xff1a; 特点&#xff1a; 使用场景&#xff1a; 3. Jackson 基本介绍&#xff1a; 核心功能…...

GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147049923 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…...

UE5,LogPackageName黄字警报处理方法

比如这个场景&#xff0c;淘宝搜索&#xff0c;ue5 T台&#xff0c;转为ue5.2后&#xff0c;选择物体&#xff0c;使劲冒错。 LogPackageName: Warning: DoesPackageExist called on PackageName that will always return false. Reason: 输入“”为空。 2. 风险很大的删除法&…...

unity曲线射击

b站教程 using UnityEngine; using System.Collections;public class BallLauncher : MonoBehaviour {public float m_R;public NewBullet m_BulletPre;public Transform m_Target;private void Start(){StartCoroutine(Attack());}private void OnDestroy(){StopAllCoroutine…...

freecad内部python来源 + pip install 装包

cmake来源&#xff1a; 只能find默认地址&#xff0c;我试过用虚拟的python地址提示缺python3config.cmake 源码来源&#xff1a; pip install 装包&#xff1a; module_to_install "your pakage" import os import FreeCAD import addonmanager_utilities as util…...

【家政平台开发(36)】数据迁移与初始化开发:筑牢家政平台的数据根基

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

Spring Boot 中集成 Knife4j:解决文件上传不显示文件域的问题

Spring Boot 中集成 Knife4j&#xff1a;解决文件上传不显示文件域的问题 在使用 Knife4j 为 Spring Boot 项目生成 API 文档时&#xff0c;开发者可能会遇到文件上传功能不显示文件域的问题。本文将详细介绍如何解决这一问题&#xff0c;并提供完整的解决方案。 Knife4j官网…...