【好文推荐】openGauss 5.0.0 数据库安全——全密态探究
前言
写此文章的目的,主要是验证:
openGauss 5.0.0 数据库能够实现哪种加密方式的全密态
全密态数据库的特点
一、全密态介绍


全密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效的价值信息,从而起到保护数据隐私的能力。
由于整个业务数据流在数据处理过程中都是以密文形态存在,通过全密态数据库,可以实现:
1)保护数据在云上全生命周期的隐私安全。无论数据处于何种状态,攻击者都无法从数据库服务端获取有效信息。
2)帮助云服务提供商获取第三方信任。无论是企业服务场景下的业务管理员、运维管理员,还是消费者云业务下的应用开发者,用户通过将密钥掌握在自己手上,使得高权限用户无法获取数据有效信息。
3)让云数据库服务借助全密态能力更好的遵守个人隐私保护方面的法律法规。
全密态数据库目前支持两种连接方式:gsql连接和jdbc连接。
二、环境准备
本次实验使用的操作系统是centos7.9,openGauss版本是5.0.0,实验直接在一台服务器上面进行。
操作系统

- 数据库版本

三、实验过程
1、创建用户
使用管理员用户登录,然后参加一个qmttest用户,密码设置为"qwer1234!@#$"
CREATE USER qmttest PASSWORD 'qwer1234!@#$';
使用qmttest用户登录,连接密态数据库.
gsql -p 15400 -d postgres -U qmttest -r -C-C:是打开密态开关

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);
查看生成的相应加密文件

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);
查看生成的相应加密文件
2.1.3 SM2
使用SM2加密算法进行创建CMK 名称:qmt_SM2CREATE CLIENT MASTER KEY qmt_SM2 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_SM2", ALGORITHM = SM2);
查看生成的相应加密文件
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);

有报错
ERROR(CLIENT): National secret algorithm must be used together.国家密码算法必须一起使用

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);
名称: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);
有报错
ERROR(CLIENT): National secret algorithm must be used together.国家密码算法必须一起使用

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.国家密码算法必须一起使用

使用 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.国家密码算法必须一起使用

使用 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);
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

插入数据
INSERT INTO RSA_2048_256_TB VALUES (2,'joy','6219985678349800033');

客户端查询数据

通过不加 -C 登录查询数据
select * from RSA_2048_256_TB;

可以看出,数据已经加密。
加密成功,查询成功
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));
插入数据
INSERT INTO RSA_3072_256_TB VALUES (2,'joy','6219985678349800033');

客户端查询数据

通过不加 -C 登录查询数据
select * from RSA_3072_256_TB;

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));
插入数据
INSERT INTO RSA_2048_128_TB VALUES (2,'joy','6219985678349800033');

客户端查询数据

通过不加 -C 登录查询数据
select * from RSA_2048_128_TB;

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));
插入数据
INSERT INTO RSA_3072_128_TB VALUES (2,'joy','6219985678349800033');

客户端查询数据

通过不加 -C 登录查询数据
select * from RSA_3072_128_TB;

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));
插入数据
INSERT INTO SM2_SM4_SM3_TB VALUES (2,'joy','6219985678349800033');

客户端查询数据

通过不加 -C 登录查询数据
select * from SM2_SM4_SM3_TB;

4、组合加密方式验证
同一个表中,不同的列使用不同的加密方式。
表名称:all_TB
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));说明:不同的列,使用不同的加密方式。
列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

插入数据
INSERT INTO all_TB VALUES (2,'joy1','6219985678349800033','joy2','6219985678349800033','joy3');

客户端查询数据

通过不加 -C 登录查询数据
select * from all_TB;

四、总结
在openGauss 3.0 版本中,国密SM2+SM4_SM3组合使用中,在查询时,是有问题的,openGauss 5.0.0 这个版本中,这个问题已经解决。
同一个表中,列可以是加密的,也可以是不加密的。
同一个表中,可以有不同的加密方式。
想要查询到明文,客户端必须有密钥文件,密钥文件需要进行妥善保管。
相关文章:
【好文推荐】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)这个概念来自童话故事“汉赛尔和格莱特”,当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路。 在网站应用中࿰…...
VS2019创建GIt仓库时剔除文件或目录
假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”,选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore,直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
