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

【好文推荐】openGauss 5.0.0 数据库安全——全密态探究

前言

写此文章的目的,主要是验证:

  • openGauss 5.0.0 数据库能够实现哪种加密方式的全密态

  • 全密态数据库的特点

一、全密态介绍

ffc984858dbb5ecc6a24446e3822b6a3.jpeg
b40739ab6f9754eda08083b23549f1ca.jpeg
全密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效的价值信息,从而起到保护数据隐私的能力。

由于整个业务数据流在数据处理过程中都是以密文形态存在,通过全密态数据库,可以实现:

  • 1)保护数据在云上全生命周期的隐私安全。无论数据处于何种状态,攻击者都无法从数据库服务端获取有效信息。

  • 2)帮助云服务提供商获取第三方信任。无论是企业服务场景下的业务管理员、运维管理员,还是消费者云业务下的应用开发者,用户通过将密钥掌握在自己手上,使得高权限用户无法获取数据有效信息。

  • 3)让云数据库服务借助全密态能力更好的遵守个人隐私保护方面的法律法规。

全密态数据库目前支持两种连接方式:gsql连接和jdbc连接。

二、环境准备

本次实验使用的操作系统是centos7.9,openGauss版本是5.0.0,实验直接在一台服务器上面进行。

  • 操作系统
    6f2e09cc7e9b6670c9b6975acda76943.jpeg

  • 数据库版本

    c6f0776fe78897625896ed770584606f.jpeg

三、实验过程

1、创建用户

使用管理员用户登录,然后参加一个qmttest用户,密码设置为"qwer1234!@#$"

CREATE USER qmttest PASSWORD 'qwer1234!@#$';

b220c016fd820bec189f816e0ee2aab1.jpeg

使用qmttest用户登录,连接密态数据库.

-C:是打开密态开关

gsql -p 15400 -d postgres -U qmttest -r -C

14587669c17e3a62deff98864aacc3f1.jpeg

2、创建用户密钥

全密态数据库有两种密钥,即客户端主密钥CMK和数据加密密钥CEK。CMK用于加密CEK,CEK用于加密用户数据。密钥创建的顺序和依赖依次为:创建CMK > 创建CEK。

从这里开始验证加密方式的组合。

序号 主密钥CMK 数据加密密钥CEK 1 RSA_2048 AEAD_AES_256_CBC_HMAC_SHA256 2 RSA_3072 AEAD_AES_128_CBC_HMAC_SHA256 3 SM2 SM4_SM3 2.1 创建客户端主密钥CMK

密钥存储路径:默认情况下,localkms将在(LOCALKMS_FILE_PATH)路径下生成/读取/删除密钥文件,用户可手动配置该环境变量。但是,用户也可以不用单独配置该环境变量,在尝试获取LOCALKMS_FILE_PATH失败时,localkms会尝试获取($GAUSSHOME/etc/localkms/)路径,如果该路径存在,则将其作为密钥存储路径。密钥相关文件名:使用CREATE CMK语法时,localkms将会创建四个与存储密钥相关的文件。示例:当KEY_PATH = “key_path_value”, 四个文件的名称分别为key_path_value.pub、key_path_value.pub.rand、 key_path_value.priv、 key_path_value.priv.rand。所以,为了能够成功创建密钥相关文件,在密钥存储路径下,应该保证没有已存在的与密钥相关文件名同名的文件。

2.1.1 RSA_2048
使用RSA_2048加密算法进行创新CMK 名称:qmt_rsa2048CREATE CLIENT MASTER KEY qmt_rsa2048 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_rsa2048", ALGORITHM = RSA_2048);

91ac3418c7a89d854c2c6a995dd1cf1f.jpeg
查看生成的相应加密文件

421c82129f1467ee54c9f211fbc2795e.jpeg

2.1.2 RSA_3072
使用RSA_3072加密算法进行创建CMK 名称:qmt_RSA3072CREATE CLIENT MASTER KEY qmt_RSA3072 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_RSA3072", ALGORITHM = RSA_3072);
c14b3def2e2eb5e415cee3f0263685e6.jpeg
查看生成的相应加密文件
c7a4a4ea4b09be7ba7febd6cef8d0cad.jpeg
2.1.3 SM2
使用SM2加密算法进行创建CMK 名称:qmt_SM2CREATE CLIENT MASTER KEY qmt_SM2 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_SM2", ALGORITHM = SM2);

81349a80d16c5dc34c5d477a22bae570.jpeg
查看生成的相应加密文件
dee39844c07444e10d053476ea4cd412.jpeg

2.2 创建数据加密密钥CEK

2.2.1 AEAD_AES_256_CBC_HMAC_SHA256
使用 RSA_2048 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK 名称:RSA_2048_256_CEKCREATE COLUMN ENCRYPTION KEY RSA_2048_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

c470fc5332fdaa646375497953400b80.jpeg

使用 RSA_3072 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK 名称:RSA_3072_256_CEKCREATE COLUMN ENCRYPTION KEY RSA_3072_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

0f0a4a2430ad918cab0b320be1f47e4c.jpeg

使用 SM2 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK 名称:SM2_256_CEK 创建失败CREATE COLUMN ENCRYPTION KEY SM2_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

e118e16a444cf742f618949c4586adba.jpeg

2.2.2 AEAD_AES_128_CBC_HMAC_SHA256
使用 RSA_2048 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK 名称:RSA_2048_128_CEKCREATE COLUMN ENCRYPTION KEY RSA_2048_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

a81ce2a0e0531c370ff1b072da98f98d.jpeg

使用 RSA_3072 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK

名称:RSA_3072_128_CEK

CREATE COLUMN ENCRYPTION KEY RSA_3072_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

6e1db1989e47a5972efcb80ebd168ca3.jpeg

使用 SM2 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK 名称:SM2_128_CEK 创建失败CREATE COLUMN ENCRYPTION KEY SM2_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

032722a009d9a41e208555b4e663d15a.jpeg

2.2.3 SM4_SM3
使用 RSA_2048 + SM4_SM3 创建CEK 名称:RSA_2048_SM4_SM3_CEK 创建失败CREATE COLUMN ENCRYPTION KEY RSA_2048_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM =SM4_SM3);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

6062c181303c46588c99b6e128f73687.jpeg
使用 RSA_3072 + SM4_SM3 创建CEK

名称:RSA_3072_SM4_SM3_CEK

创建失败

CREATE COLUMN ENCRYPTION KEY RSA_3072_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = SM4_SM3);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

9b0897529a93ac7f7d803797f97fc316.jpeg

使用 SM2 + SM4_SM3 创建CEK

名称:SM2_SM4_SM3_CEK

CREATE COLUMN ENCRYPTION KEY SM2_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = SM4_SM3);

d21d5a68ed4a4a199f50a446cea1b6ac.jpeg

2.3 总结

序号 数据加密密钥CEK 主密钥CMK 组合名称 是否创建成功 1 AEAD_AES_256_CBC_HMAC_SHA256 RSA_2048 RSA_2048_256_CEK 2 AEAD_AES_256_CBC_HMAC_SHA256 RSA_3072 RSA_3072_256_CEK 3 AEAD_AES_256_CBC_HMAC_SHA256 SM2 SM2_256_CEK 4 AEAD_AES_128_CBC_HMAC_SHA256 RSA_2048 RSA_2048_128_CEK 5 AEAD_AES_128_CBC_HMAC_SHA256 RSA_3072 RSA_3072_128_CEK 6 AEAD_AES_128_CBC_HMAC_SHA256 SM2 RSM2_128_CEK 7 SM4_SM3 RSA_2048 RSA_2048_SM4_SM3_CEK 8 SM4_SM3 RSA_3072 SA_3072_SM4_SM3_CEK 9 SM4_SM3 SM2 SM2_SM4_SM3_CEK

国密加密算法 SM2 SM4_SM3 不能和其他加密方式组合。

目前创建数据加密密钥CEK是成功的,下面进行使用测试。

3、表加密测试

3.1 使用RSA_2048_256_CEK创建加密表

  • 表名称:RSA_2048_256_TB

CREATE TABLE RSA_2048_256_TB (id_number int, name text encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC));

2ada8ffb6aecf0046224ff94d3842515.jpeg

  • 插入数据

INSERT INTO RSA_2048_256_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_2048_256_TB VALUES (2,'joy','6219985678349800033');

57ce31e203e654ddec606cb64a1951fb.jpeg

  • 客户端查询数据

select * from RSA_2048_256_TB;

e7aa31939bc1791d9bd767f7603af8ee.jpeg

  • 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_2048_256_TB;

246efe5e8314b22e0c667b9c85293da6.jpeg
可以看出,数据已经加密。

加密成功,查询成功

3.2 使用RSA_3072_256_CEK创建加密表

名称:RSA_3072_256_TB

CREATE TABLE RSA_3072_256_TB (id_number int, name text encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC));

7ff5b4c0a760a54ef03bc40ca03291d6.jpeg

  • 插入数据

INSERT INTO RSA_3072_256_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_3072_256_TB VALUES (2,'joy','6219985678349800033');

af03d6546dbfc8ff6f08b9ff6523aefe.jpeg

  • 客户端查询数据

select * from RSA_3072_256_TB;

cf89c91e786d4fcc0151a16e08664638.jpeg

  • 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_3072_256_TB;

040738819d17b1f12bab3c61ce08b97f.jpeg

3.3 使用RSA_2048_128_CEK创建加密表

名称:RSA_2048_128_TB

CREATE TABLE RSA_2048_128_TB (id_number int, name text encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC));

c345f7c2eebcc56ce49cb48e5e436250.jpeg

  • 插入数据

INSERT INTO RSA_2048_128_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_2048_128_TB VALUES (2,'joy','6219985678349800033');

9eb311bf3a02a40bec9b327b996813d1.jpeg

  • 客户端查询数据

select * from RSA_2048_128_TB;

f2b6b6df5cf2b42a71ec952ae015770b.jpeg

  • 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_2048_128_TB;

7aa8fff7fd2904024dc25dd8cf3a60dc.jpeg

3.4 使用RSA_3072_128_CEK创建加密表

名称:RSA_3072_128_TB

CREATE TABLE RSA_3072_128_TB (id_number int, name text encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC));

8fabcc33831f48a46c67e96a1528cd44.jpeg

  • 插入数据

INSERT INTO RSA_3072_128_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_3072_128_TB VALUES (2,'joy','6219985678349800033');

f1087556823d1742ac03ac7f064e9d18.jpeg

  • 客户端查询数据

select * from RSA_3072_128_TB;

d7f642633f3d5d190d981e617438a8a6.jpeg

  • 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_3072_128_TB;

40b14bf87c9d06b13a9b21e46377dd8d.jpeg

3.5 使用SM2_SM4_SM3_CEK创建加密表

名称:SM2_SM4_SM3_TB

CREATE TABLE SM2_SM4_SM3_TB (id_number int, name text encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC));

8c93eb067b5e769b7c6411a3932f025c.jpeg

  • 插入数据

INSERT INTO SM2_SM4_SM3_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO SM2_SM4_SM3_TB VALUES (2,'joy','6219985678349800033');

f0c3d8e762241e4ee146e59408c43c36.jpeg

  • 客户端查询数据

select * from SM2_SM4_SM3_TB;

96c6ea1a682a73f7b079ea7c0a4dda9d.jpeg

  • 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from SM2_SM4_SM3_TB;

5aaf882b139d05ade9f7f2388e7615e2.jpeg

4、组合加密方式验证

同一个表中,不同的列使用不同的加密方式。

  • 表名称:all_TB

说明:不同的列,使用不同的加密方式。
列id_number:不使用加密
列name1:RSA_2048_256_CEK,列credit_card1:RSA_3072_256_CEK,
列name2:RSA_2048_128_CEK,列credit_card2:RSA_3072_128_CEK,
列name3:SM2_SM4_SM3_CEK

CREATE TABLE all_TB (id_number int, name1 text encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC),credit_card1 varchar(19) encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC),name2 text encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC),credit_card2 varchar(19) encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC),name3 text encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC));

365555d2d0230fbe39e01c91409e6277.jpeg

  • 插入数据

INSERT INTO all_TB VALUES (1,'joe1','6217986500001288393','joe2','6217986500001288393','joe3');
INSERT INTO all_TB VALUES (2,'joy1','6219985678349800033','joy2','6219985678349800033','joy3');

badd334632a73d84dc57c428ad9199f1.jpeg

  • 客户端查询数据

select * from all_TB;

3c4852fb9e842178fd5322b1c426d1e2.jpeg

  • 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from all_TB;

bbc95a39f4befa023915b9cb4c6467fe.jpeg

四、总结

  1. 在openGauss 3.0 版本中,国密SM2+SM4_SM3组合使用中,在查询时,是有问题的,openGauss 5.0.0 这个版本中,这个问题已经解决。

  2. 同一个表中,列可以是加密的,也可以是不加密的。

  3. 同一个表中,可以有不同的加密方式。

  4. 想要查询到明文,客户端必须有密钥文件,密钥文件需要进行妥善保管。


相关文章:

【好文推荐】openGauss 5.0.0 数据库安全——全密态探究

前言 写此文章的目的,主要是验证: openGauss 5.0.0 数据库能够实现哪种加密方式的全密态全密态数据库的特点 一、全密态介绍 全密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传…...

堆的介绍与堆的实现和调整

个人主页:Lei宝啊 愿所有美好如期而遇 目录 ​​堆的介绍: 关于堆的实现及相关的其他问题: 堆的初始化: 堆的销毁: 插入建堆: 堆向上调整: 交换两个节点的值: 堆向下调整&a…...

【广州华锐互动】马属直肠检查3D虚拟仿真课件

随着科技的发展,医疗行业也在不断地进行创新。其中,广州华锐互动开发的马属直肠检查3D虚拟仿真课件,为医学教育和实践操作带来了新的可能性。它不仅可以帮助医生提高诊断准确率,还可以让医学生在没有真实病人的情况下进行实践操作…...

Nuxt 菜鸟入门学习笔记:路由

文章目录 路由 Routing页面 Pages导航 Navigation路由参数 Route Parameters路由中间件 Route Middleware路由验证 Route Validation Nuxt 官网地址: https://nuxt.com/ 路由 Routing Nuxt 的一个核心功能是文件系统路由器。pages/目录下的每个 Vue 文件都会创建一…...

C++基本语法和注释

C程序介绍 C 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃…...

CSRF攻击

防御策略 过滤判断换referer头,添加tocken令牌验证,白名单 CSRF攻击和XSS比较 相同点:都是欺骗用户 不同点: XSS有攻击特征,所有输入点都要考虑代码,单引号过滤 CSRF没有攻击特征,利用的点…...

2023 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|数学建模完整代码+建模过程全解全析

问题一:区域碳排放量以及经济、人口、能源消费量的现状分析 思路: 定义碳排放量 Prediction 模型: CO2 P * (GDP/P) * (E/GDP) * (CO2/E) 其中: CO2:碳排放量 P:人口数量 GDP/P:人均GDP E/GDP:单位GDP能耗 CO2/E:单位能耗碳排放量 2.收集并统计相关…...

【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后,LCD1604显示传感器检测的温湿度、光线强度和风速,工作模式,以及相应阈值,系统工作状态等;系统默认为自动模式, 可通过K4…...

C/C++代码静态检测工具PC-Lint常见错误总结

目录 1、PC-Lint 概述 2、PC-lint 常见错误列举 3、PC-Lint报告的语法错误 4、总结 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到…...

概率深度学习建模数据不确定性

https://zhuanlan.zhihu.com/p/568912284理解论文 What uncertainties do we need in Bayesian deep learning for computer vision? (NeurIPS 2017) [1]中的数据不确定性建模,并给出公式推导。论文[1]指出不确定性uncertainty分为随机不确定性(aleator…...

Jenkins自动化部署前后端分离项目 (svn + Springboot + Vue + maven)有图详解

1. 准备工作 本文的前后端分离项目,技术框架是: Springboot Vue Maven SVN Redis Mysql Nginx JDK 所以首先需要安装以下: 在腾讯云服务器OpenCLoudOS系统中安装jdk(有图详解) 在腾讯云服务器OpenCLoudOS系统…...

【ELK】日志系统部署

一、ELK日志分析系统 1、ELK的组成 ElasticSearchLogStashKibana ELK基于这三个开源日志的收集、存储、检索和可视化的解决方案;可帮助用户快速定位和分析应用程序的故障,监控应用程序性能和安全,以及提供丰富的数据分析和展示功能。 2、完…...

【算法挨揍日记】day08——30. 串联所有单词的子串、76. 最小覆盖子串

30. 串联所有单词的子串 30. 串联所有单词的子串 题目描述: 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["…...

SpringCloud Gateway--网关服务基本介绍和基本原理

😀前言 本篇博文是关于SpringCloud Gateway的基本介绍,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力…...

使用Vue-cli构建spa项目及结构解析

一,Vue-cli是什么? 是一个官方发布的Vue脚手架工具,用于快速搭建Vue项目结构,提供了现代前端开发所需要的一些基础功能,例如:Webpack打包、ESLint语法检查、单元测试、自动化部署等等。同时,Vu…...

自定义Unity组件——AudioManager(音频管理器)

需求描述 在游戏开发中,音频资源是不可或缺的,通常情况下音频资源随机分布,各个音频的操作和管理都是各自负责,同时对于音频的很多操作逻辑都是大同小异的,这就造成了许多冗余代码的堆叠,除此之外在获取各类…...

leetcode 558 设计内存文件系统

题目 Design an in-memory file system to simulate the following functions: ls: Given a path in string format. If it is a file path, return a list that only contains this files name. If it is a directory path, return the list of file and directory namesin th…...

Haproxy负载均衡群集

HAproxy搭建Web群集一、Web集群调度器1、常见的Web集群调度器2、常用集群调度器的优缺点(LVS ,Nginx,Haproxy)2.1 Nginx2.2 LVS2.3 Haproxy 3、LVS、Nginx、HAproxy的区别 二、Haproxy1、简介2、Haproxy应用分析3、HAProxy的主要特性4、Haproxy调度算法(…...

什么是面包屑导航?

面包屑导航(Breadcrumb Navigation)这个概念来自童话故事“汉赛尔和格莱特”,当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路。 在网站应用中&#xff0…...

VS2019创建GIt仓库时剔除文件或目录

假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”,选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore,直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...