基于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…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...