基于openGauss5.0.0全密态数据库等值查询小案例
基于openGauss5.0.0全密态数据库等值查询小案例
- 一、全密态数据库简介
- 二、环境说明
- 三、测试步骤
- 四、使用约束
一、全密态数据库简介
- 价值体现:
密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效的价值信息,从而起到保护数据隐私的作用。
2. 特性介绍
从用户视角来看,整个密态等值查询的主要功能分为三部分,主要通过新增的KeyTool工具以及openGauss的增强gsql客户端来实现。
首先是客户端密钥管理功能,用户借助新增的KeyTool工具来实现CMK的生成、销毁和更新,同时支持密钥导入导出。通过该KeyTool工具的导入导出功能,CMK可以在不同的客户端间进行传输;同时,KeyTool实现了单个客户端侧的密钥管理,通过配置管理文件,可以对密钥的存储、更新进行管理。
其次该特性提供密钥创建功能和加密表创建功能,通过新增SQL语法“CREATE CLINET MASTER KEY”和“CREATE COLUMN ENCRYPTION KEY”实现在数据库侧记录和管理CMK和CEK元信息,CMK和CEK信息被记录在新增的系统表中。通过扩展“CREATE TABLE”语法为表的每一个敏感信息列指定列加密密钥和加密算法,方便后续数据密文存储。
最后该特性对用户提供密态等值查询能力,该部分功能是整个特性的核心,虽然用户对整个密文查询无感知,但是在指定数据的加密信息后,针对该敏感数据的查询将受限于当前密态等值查询的支持规格。
从整体视角来看,该特性所实现的功能主要是为了用户基于敏感数据保护的诉求来存储管理数据并基于密文数据信息实现查询任务。
二、环境说明
- 虚拟机:virtualbox
- 操作系统:openEuler 20.03 TLS SP1
- 数据库:openGauss 5.0.0 单节点部署
三、测试步骤
-
创建密钥
- 创建密钥前,需要规划好本地密钥存储路径,且须保证数据库用户(如omm)具有操作该路径的权限。本案例路径为:
/opt/software/openGauss,且该路径目录及文件所属组为omm:dbgrp - 将该路径下配置到数据库用户下的环境变量配置文件中,如omm用户下的
~/.bashrc:echo "export LOCALKMS_FILE_PATH=/opt/software/openGauss" >> ~/.bashrc - 环境变量生效
source ~/.bashrc - 以gsql全密态方式登录数据库,
-C表示开启密态开关gsql -d postgres -p 15432 -r -C - 创建密钥
密钥包括CMK和CEK。CMK是主密钥,用于加密CEK;而CEK是数据密钥,用于加密数据。CEK的创建要依赖于CMK,因此要先创建CMK,再创建CEK。重要说明:当前KEY_STORE仅支持localkms,ALGORITHM 支持RSA_2048、RSA3072和SM2;由于SM2、SM3、SM4等算法属于中国国家密码标准算法,为规避法律风险,需配套使用。如果创建CMK时指定SM4算法来加密CEK,则创建CEK时必须指定SM4_SM3算法来加密数据。CREATE CLIENT MASTER KEY ImgCMK WITH (KEY_STORE = localkms, KEY_PATH = "key_path_value", ALGORITHM = RSA_2048); CREATE COLUMN ENCRYPTION KEY ImgCEK WITH VALUES (CLIENT_MASTER_KEY = ImgCMK, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);
命令执行成功后,会在本地生成密钥文件,如下所示:

- 查看系统表,检查是否有密钥信息:
openGauss=# SELECT * FROM gs_client_global_keys;global_key_name | key_namespace | key_owner | key_acl | create_date -----------------+---------------+-----------+---------+----------------------------imgcmk | 2200 | 10 | | 2023-12-26 09:32:26.048963 (1 row)openGauss=# SELECT column_key_name,column_key_distributed_id ,global_key_id,key_owner FROM gs_column_keys;column_key_name | column_key_distributed_id | global_key_id | key_owner -----------------+---------------------------+---------------+-----------imgcek | 3618369306 | 33446 | 10 (1 row)
- 创建密钥前,需要规划好本地密钥存储路径,且须保证数据库用户(如omm)具有操作该路径的权限。本案例路径为:
-
创建加密表
- 创建加密表
CREATE TABLE creditcard_info (id_number int, name text encrypted with (column_encryption_key = ImgCEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = ImgCEK, encryption_type = DETERMINISTIC)); - 查看表结构
openGauss=# \d+ creditcard_info;Table "public.creditcard_info"Column | Type | Modifiers | Storage | Stats target | Description -------------+-------------------+------------+----------+--------------+-------------id_number | integer | | plain | |name | text | encrypted | extended | |credit_card | character varying | encrypted | extended | | Has OIDs: no Options: orientation=row, compression=no - 插入表数据
INSERT INTO creditcard_info VALUES(1,'joe','6217986500001288393'),(2, 'joy','6219985678349800033');
- 创建加密表
-
全密态等值查询
- 第一种查询方式:开启密态开关进行查看
gsql登录数据库,查看如下:全以正常明文显示结果且支撑在加密列上进行等值查询。[omm@openEuler02 openGauss]$ gsql -d postgres -p 15432 -r -C openGauss=# select * from public.creditcard_info;id_number | name | credit_card -----------+------+---------------------1 | joe | 62179865000012883932 | joy | 6219985678349800033 (2 rows)openGauss=# select * from public.creditcard_info where name = 'joe';id_number | name | credit_card -----------+------+---------------------1 | joe | 6217986500001288393 (1 row)openGauss=# select * from public.creditcard_info where name = 'joy';id_number | name | credit_card -----------+------+---------------------2 | joy | 6219985678349800033 (1 row) - 第二种查询方式:关闭密态开关进行查看,结果如下:
加密列全部以密文方式呈现。且无法使用加密列作为等值查询的列或条件。[omm@openEuler02 openGauss]$ gsql -p 15432 -d postgres -r gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:09:38 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help.openGauss=# \dList of relationsSchema | Name | Type | Owner | Storage --------+-----------------+-------+-------+----------------------------------public | creditcard_info | table | omm | {orientation=row,compression=no} (1 row)openGauss=# select * from creditcard_info;id_number | name |credit_card -----------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1 | \x011aefabd7469d77248aa31885878bb77607981efec65eff3271053e44b45d639d8976168a31000000dd1092fa8926f98b29d736c9553472bb821d07b9a6ba5ee5d0439e5e73a8adc9 | \x011aefabd79ce3f9ef953994577ecf46395b118f38d3b70a0e55b2c29d4a7817a15ac70799310000004b7153b0fd01156b87abf1ca3f53632a5810777da8cc1a3143dad27e1962bf6bda021e7bd718b40ddc0b3a9ec1ef260d2 | \x011aefabd72d06b1228a54a522593d47e067ee949b2e0e69e53c25832141bc1e9b44b922533100000095340c76388706c6551fb67972049c2c09c1b50360e0f3b4e19ab29c84d759f3 | \x011aefabd7b54376da6c719bae031a02cb248bccacfc37008f328ad889b6a7e08aa4a766613100000002379e139f7a9cf407f8e4a1b16ae959120491a787c02eba3c9f4394b799c70ac0a4f5debeeb5a7e312c94e4c71bd1cf (2 rows)openGauss=# select * from creditcard_info where name = 'joy'; ERROR: invalid input syntax for type byteawithoutorderwithequalcol LINE 1: select * from creditcard_info where name = 'joy';^ openGauss=# select * from public.creditcard_info where name = 'joe'; ERROR: invalid input syntax for type byteawithoutorderwithequalcol LINE 1: select * from public.creditcard_info where name = 'joe';^ openGauss=# - 第三种查询方式:新建新用户且授予查看表等权限进行查看
新建普通用户,如testuser
使用新用户testuser登录到数据库中,执行查询语句,具体如下:[omm@openEuler02 openGauss]$ gsql -d postgres -p 15432 -r -C gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:09:38 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help.openGauss=# create user testuser password 'openGauss@1234'; CREATE ROLE openGauss=# grant all privileges on public.creditcard_info to testuser; GRANT
由此,可看出:[omm@openEuler02 openGauss]$ gsql -d postgres -p 15432 -U testuser -W openGauss@1234 -r -C gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:09:38 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help.openGauss=> \dList of relationsSchema | Name | Type | Owner | Storage --------+-----------------+-------+-------+----------------------------------public | creditcard_info | table | | {orientation=row,compression=no} (1 row)openGauss=> select * from creditcard_info; ERROR(CLIENT): failed to decrypt column encryption key openGauss=> select * from creditcard_info where name = 'joe'; ERROR: invalid input syntax for type byteawithoutorderwithequalcol LINE 1: select * from creditcard_info where name = 'joe';^ openGauss=> \d+ creditcard_infoTable "public.creditcard_info"Column | Type | Modifiers | Storage | Stats target | Description -------------+-------------------+------------+----------+--------------+-------------id_number | integer | | plain | |name | text | encrypted | extended | |credit_card | character varying | encrypted | extended | | Has OIDs: no Options: orientation=row, compression=noopenGauss=> select id_number from creditcard_info;id_number -----------12 (2 rows)openGauss=>- 无论是否打开密态开关,都无法查询到加密数据,报错如下:
ERROR(CLIENT): failed to decrypt column encryption key - 非加密列查询是正常的,如id_number列是正常显示
- 无论是否打开密态开关,都无法查询到加密数据,报错如下:
- 第一种查询方式:开启密态开关进行查看
四、使用约束
数据以列级别进行加密,而无法按照行级别区分加密策略。
除Rename操作外,不支持通过Alter Table语法实现对加密表列的更改(包括加密列和非加密列之间的互转换),支持添加(Add)和删除(Drop)对应的加密列。不支持对加密列设置大部分check限制性语法,但是支持check(column is not null)语法。
当support_extended_features = off时,不支持对加密列使用primary key、unique。当support_extended_features = on时,仅支持确定性加密列使用primary key、unique。
不支持不同数据类型之间的隐式转换。
不支持不同数据类型密文间的集合操作。
不支持加密列创建范围分区。
加密列仅支持repeat和empty_blob()函数。
当前版本只支持gsql和JDBC(部署在linux操作系统)客户端,暂不支持ODBC等其他客户端实现密态等值查询。
使用JDBC客户端时,密态等值查询特性不能与负载均衡或自动选主特性同时开启。
只支持通过客户端执行copy from stdin的方式、\copy命令的方式以及insert into values(…)的方式往密态表中导入数据。
不支持从加密表到文件之间的copy操作。
不支持包括排序、范围查询以及模糊查询等在内的除等值以外的各种密态查询。
支持部分函数存储过程密态语法,密态支持函数存储过程具体约束查看《数据库管理》数据安全管理/密态支持函数/存储过程章节。
不支持通过insert into…select…、merge into语法将非加密表数据插入到加密表数据中。
对于处于连接状态的连接请求,只有触发更新缓存的操作(更改用户、解密加密列失败等)和重新建连后才能感知服务端CEK信息变更。
不支持在由随机加密算法加密的列上进行密态等值查询。
对于密态等值查询运算中如果参与比较的两个属性条件采用不同的数据加密密钥,返回报错。
密态等值查询不支持时序表、外表,不支持ustore存储引擎加密。
对于数据库服务侧配置变更(pg_settings系统表、权限、密钥和加密列等信息), 需要重新建立JDBC连接保证配置变更生效。
不支持多条SQL语句一起执行,insert into语句多批次执行场景不受此条约束限制。
密态数据库对长度为零的空字符串不进行加密。
确定性加密存在频率攻击的潜在风险,不建议在明文频率分布明显的场景下使用。
具体可参考官网:全密态等值查询
到此,简单的openGauss 5.0.0全密态等值查询到此结束,感谢大家查阅,希望对你们有所帮助!!!
相关文章:
基于openGauss5.0.0全密态数据库等值查询小案例
基于openGauss5.0.0全密态数据库等值查询小案例 一、全密态数据库简介二、环境说明三、测试步骤四、使用约束 一、全密态数据库简介 价值体现: 密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传…...
Oracle中varchar2和nvarchar2的区别
Oracle中的varchar2和nvarchar2都是可变长度的字符数据类型,这意味着它们能够根据实际存储的数据长度来动态调整占用的空间。但它们之间有以下主要区别: 1. 字符编码和存储: - VARCHAR2:存储的是字节字符串,对字符…...
linux环境下从一个服务器复制文件到另一个服务器
在Linux中使用scp命令可以将文件或目录从一台服务器复制到另外一台服务器。 # 从源服务器复制文件到目标服务器 scp /path/to/source_file usernamedestination:/path/to/destination_directory # 从源服务器复制目录及其内容到目标服务器 scp -r /path/to/source_directory us…...
JSoup 爬虫遇到的 404 错误解决方案
在网络爬虫开发中,使用JSoup进行数据抓取是一种常见的方式。然而,当我们尝试使用JSoup来爬虫抓取腾讯新闻网站时,可能会遇到404错误。这种情况可能是由于网站的反面爬虫机制检测到了我们的爬虫行为,从而拒绝了我们的请求。 假设我…...
Vue.set 方法原理
function set(target, key, value) {// 判断是否是数组,并且 key 是一个有效的索引值if (Array.isArray(target) && isValidArrayIndex(key)) {target.length Math.max(target.length, key)target.splice(key, 1, value)return value}// 判断 key 是否已经…...
CentOS 7的新特性
CentOS 7在发布时相较于CentOS 6引入了许多重要的变化和优化。以下是一些主要的改进和新特性: 系统初始化程序:CentOS 7使用了systemd作为其初始化系统,取代了之前版本的init系统。systemd提供了更快的启动时间和更好的管理服务。 内核更新&…...
Vue 模板编译原理
Vue 模板编译原理是指将 Vue 的模板转换为渲染函数的过程。在 Vue 中,模板被定义为 HTML 代码片段或者在 .vue 单文件组件中定义。当 Vue 实例化时,会将模板编译为渲染函数,该函数可以根据组件的状态生成虚拟 DOM 并更新视图。 Vue 的模板编…...
ElementUI的Table组件行合并上手指南
ElementUI的Table组件行合并 ,示例用官网vue3版的文档 <el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%; margin-top: 20px"><el-table-column prop"id" label"ID&qu…...
【ES6】Class继承-super关键字
目录 一、前言二、ES6与ES5继承机制区别三、super作为函数1、构造函数this1)、首先要明确this指向①、普通函数②、箭头函数③、注意事项 2)、其次要明确new操作符做了哪些事情 2、super()的用法及注意点1)、用法2)、注意点 四、s…...
做亚马逊测评不知道怎么找客户?这才是亚马逊测评的正确打开方式!
如今的跨境电商内卷严重,花费大量资金做广告推广的效果却微乎其微,这也是亚马逊测评迅速崛起的最根本原因。做亚马逊测评是近年来兴起的一种方式,许多卖家都需要大量的测评来提高自己的产品排名和信誉度。很多兄弟最近来问龙哥亚马逊测评怎么…...
传感器基础:传感器使用与编程使用(三)
目录 常用传感器讲解九--雨滴传感器具体讲解电路连接代码实现 常用传感器讲解十--光传感器根据亮度安排灯具体讲解电路连接代码实现 常用传感器讲解七--light cup(KY-008)具体讲解电路连接代码实现 常用传感器讲解十二--倾斜开关传感器(KY-02…...
深入浅出:分布式、CAP 和 BASE 理论(荣耀典藏版)
大家好,我是月夜枫,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 在计算机科学领域,分布式系统是一门极具挑战性的研究方向,也是互联网应用中必不可少的优化实践&…...
vue3+elementPlus:el-drawer新增修改弹窗复用
在el-drawer的属性里设置:title属性,和重置函数 //html<!-- 弹窗 --><el-drawerv-model"drawer":title"title":size"505":direction"direction":before-close"handleClose"><el-formlabel-posit…...
使用Docker快速安装grafana
Docker 提供了一个轻量级、易于部署的容器化解决方案,让您能够方便地在不同环境中运行应用程序。以下是在 Docker 中安装 Grafana 的基本步骤: 文章目录 使用Docker快速安装grafana如何使用Grafana步骤 1:连接数据源步骤 2:创建仪…...
excel 函数技巧
1:模糊查询 LOOKUP(1,0/FIND(F1062,Sheet1!C$2:Sheet1!C$9135),Sheet1!B$2:Sheet1!B$9135) 函数含义:寻找F列1062行和sheet1中的C2行到C9135行进行模糊查询,返回该行对应的B2行到B9135行的结果。未查到返回结果0 函数公式: LO…...
Ubuntu安装WordPress并使用Nginx作为Web服务器
在Ubuntu上安装和配置WordPress并使用Nginx作为Web服务器,以下是一个简单的操作流程: 步骤 1: 安装Nginx sudo apt update sudo apt install nginx 启动Nginx并设置开机自启: sudo systemctl start nginx sudo systemctl enable nginx …...
[Linux]Ubuntu noVNC使用
又到了逛大型程序员交友 网站的时间了,今天你准备好了吗。 今天要推荐的一个有趣的项目是noVNC setup好以后是这个样子的,可以在浏览器登陆vnc,不需要再安装一个vnc client. setup的过程比较简单,分为以下几步: 1. v…...
CSRF和SSRF原理、区别、防御方法
CSRF(Cross-Site Request Forgery)原理:CSRF是一种由攻击者构造形成,由服务端发起请求的一个安全漏洞。它是一种利用用户在已登录的网站中提交非法请求的行为,攻击者通过伪造用户提交的请求,将恶意请求发送…...
如何使用JMeter测试https请求
HTTP与HTTPS略有不同,所以第一次使用JMeter测试https请求时遇到了问题,百度一番后找到解决方法:加载证书。 下面内容主要记录这次操作,便于后续参考: 操作浏览器:谷歌 (1)下载被测…...
el-table 纵向垂直表头
<template><div class"element-main"><div> Element-ui 官方提供 table Demo</div><el-tableborderstyle"width: 100%":data"tableData"><el-table-column prop"courseName" label"课程信息&qu…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...

