基于openGauss5.0.0全密态数据库等值查询小案例

news2025/2/5 12:48:44

基于openGauss5.0.0全密态数据库等值查询小案例

    • 一、全密态数据库简介
    • 二、环境说明
    • 三、测试步骤
    • 四、使用约束

一、全密态数据库简介

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

2. 特性介绍
从用户视角来看,整个密态等值查询的主要功能分为三部分,主要通过新增的KeyTool工具以及openGauss的增强gsql客户端来实现。
首先是客户端密钥管理功能,用户借助新增的KeyTool工具来实现CMK的生成、销毁和更新,同时支持密钥导入导出。通过该KeyTool工具的导入导出功能,CMK可以在不同的客户端间进行传输;同时,KeyTool实现了单个客户端侧的密钥管理,通过配置管理文件,可以对密钥的存储、更新进行管理。
其次该特性提供密钥创建功能和加密表创建功能,通过新增SQL语法“CREATE CLINET MASTER KEY”和“CREATE COLUMN ENCRYPTION KEY”实现在数据库侧记录和管理CMK和CEK元信息,CMK和CEK信息被记录在新增的系统表中。通过扩展“CREATE TABLE”语法为表的每一个敏感信息列指定列加密密钥和加密算法,方便后续数据密文存储。
最后该特性对用户提供密态等值查询能力,该部分功能是整个特性的核心,虽然用户对整个密文查询无感知,但是在指定数据的加密信息后,针对该敏感数据的查询将受限于当前密态等值查询的支持规格。
从整体视角来看,该特性所实现的功能主要是为了用户基于敏感数据保护的诉求来存储管理数据并基于密文数据信息实现查询任务。

二、环境说明

  1. 虚拟机:virtualbox
  2. 操作系统:openEuler 20.03 TLS SP1
  3. 数据库:openGauss 5.0.0 单节点部署

三、测试步骤

1. 创建密钥
2. 创建加密表
3. 全密态等值查询
  1. 创建密钥

    • 创建密钥前,需要规划好本地密钥存储路径,且须保证数据库用户(如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
      
    • 创建密钥
      密钥包括CMKCEKCMK是主密钥用于加密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)
      
  2. 创建加密表

    • 创建加密表
      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');
      
  3. 全密态等值查询

    • 第一种查询方式:开启密态开关进行查看
      gsql登录数据库,查看如下:全以正常明文显示结果且支撑在加密列上进行等值查询。
      [omm@openEuler02 openGauss]$ gsql -d postgres -p 15432 -r -C
      openGauss=# select * from public.creditcard_info;
       id_number | name |     credit_card
      -----------+------+---------------------
               1 | joe  | 6217986500001288393
               2 | 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=# \d
                                    List of relations
       Schema |      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 | \x011aefabd79ce3f9ef953994577ecf46395b118f38d3b70a0e55b2c29d4a7817a15ac70799310000004b7153b0fd01156b87abf1ca3f53632a5810777da8cc1a3143dad27e1962bf6bda021e7bd718b40ddc0b3a9ec1ef260d
               2 | \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
      [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
      
      使用新用户testuser登录到数据库中,执行查询语句,具体如下:
      [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=> \d
                                    List of relations
       Schema |      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_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
      
      openGauss=> select id_number from creditcard_info;
       id_number
      -----------
               1
               2
      (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全密态等值查询到此结束,感谢大家查阅,希望对你们有所帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟着LearnOpenGL学习10--基础光照

文章目录 一、前言二、环境光照三、漫反射光照3.1、法向量3.2、计算漫反射光照3.3、全部代码3.4、法线矩阵 四、镜面光照4.1、全部代码 一、前言 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。 因此Open…

企业微信自建应用获取用户信息

一.前言 开发企业微信自建应用的时候难免会有获取企微个人信息的业务需求,这篇博客将详细说明企微自建应用获取userId的具体流程. 二.基本概念介绍 2.1 corpid 每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业…

leetcode 1419. 数青蛙(medium)(优质解法)

链接:力扣(LeetCode)官网 - 全球极客挚的技术成长平台 代码: class Solution {public int minNumberOfFrogs(String croakOfFrogs) {String t"croak";int tLengtht.length();// hash 数组用来存放青蛙喊的过程&#xf…

企业网银 相关注意事项合辑 不断更新中...

山西省农村信用社 (shanxinj.com) 企业网上银行 山西省农村信用社 企业网上银行,注意事项: 1、通过安装【网银向导】修复网银安全控件、密码控件等; 2、登录界面无Ukey验证,也就是输入企业号、用户编号、登录密码及验证码即可进…

ARM12.26

整理三个按键中断代码 key_it.h #ifndef __KEY_IT_H__ #define __KEY_IT_H__ #include"stm32mp1xx_gpio.h" #include"stm32mp1xx_gic.h" #include"stm32mp1xx_exti.h" #include"stm32mp1xx_rcc.h" #include"led.h" void k…

九、Seata的AT模式

目录 9.1 什么是弱一致性 ?9.2 Seata的弱一致性9.3 Seata的AT模式介绍9.4 AT模式流程图9.5 AT模式注意点9.6 全局锁的理解1、认识全局锁2、注册全局锁3、校验(获取)全局锁4、释放锁5、结论 9.7 AT的多数据源场景 9.1 什么是弱一致性 &#xf…

算符优先语法分析设计原理与实现

前言: 作者的词法分析程序以及算符优先语法分析设计程序仓库链接 1、目标任务 **[实验项目] **以专题 1 词法分析程序的输出为语法分析的输入,实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。 G[E]:E→E…

PgSQL技术内幕 - ereport ERROR跳转机制

PgSQL技术内幕 - ereport ERROR跳转机制 使用客户端执行SQL的时候经常遇到报ERROR错误,然后SQL语句就退出了。当然,事务也会回滚掉。本文我们看下它是如何做到退出SQL语句并回滚事务的。 1、以insert一个numeric类型值为例 表一个字段为numeric(10,2)类型…

账号与权限管理

一、Linux用户 1.1用户类型 1.普通用户:权限受到限制的用户 2.超级管理员:至高无上的权限 3.程序用户:是给程序使用的,不允许登录(为了安全性考虑) 能不能打开文件和用户有关,用户有自己的权限 运行程序不能使用超…

关于chatglm3 function calling的理解

ChatGLM3-6B开源了工具调用,好奇他是怎么实现的,所以写了这个文章记录。 一、测试官方的示例 官方给的示例很简单,只不过给的两个函数 track 和 text-to-speech 没有具体的实现,模型的输出也只是给出了需要调用的函数名和参数。剩…

w16php系列之基础数组

一、索引数组 概念 索引数组 是指键名为整数的数组。默认情况下&#xff0c;索引数组的键名是从0开始&#xff0c;并依次递增。它主要适用于利用位置&#xff08;0、1、2……&#xff09;来标识数组元素的情况。另外&#xff0c;索引数组的键名也可以自己指定 示例代码 <…

网络调优,部署内网备份冗余和负载分担---实验

目录 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 配置步骤&#xff1a; 配置命令: 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 主机获取IP地址&#xff0c;访问WEB服务器&#xff0c;WEB服务器网关在SW5上SW5作为VLAN10,V…

【实施】共享目录防火墙

文章目录 一、共享文件1.1 为什么需要配置文件夹共享功能1.2 配置文件夹共享功能1.3 访问共享文件1.4 普通共享和高级共享 二、安装JDK和Tomcat2.1 安装JDK2.2 安装Tomcat 三、防火墙配置 一、共享文件 1.1 为什么需要配置文件夹共享功能 我们在工作和生活中经常有需要将自己…

2024年五个大胆的网络安全预测

纵观历史&#xff0c;网络安全行业不断对攻击者的转变以及运营现实的变化做出反应&#xff0c;新的一年也不例外。随着人工智能和云计算等新技术改变网络安全格局&#xff0c;攻击者和防御者之间的猫捉老鼠游戏肯定会加剧&#xff0c;并且会变得更加复杂。 再加上其他因素&…

带你学C语言~指针(3)

目录 ✍0.前言 &#x1f680;1.字符指针变量 &#x1f685;2.数组指针变量 &#x1f431;‍&#x1f3cd;2.1.数组指针变量是什么 &#x1f431;‍&#x1f3cd;2.2数组指针变量怎么初始化 &#x1f6a2;3.二维数组传参的本质 &#x1f680;4.函数指针变量 ✈4.1函数指…

15个主流设计灵感网站,激发你的创作灵感!

即时设计 即时设计是一种强大的云设计工具&#xff0c;已成为许多设计师、产品经理和开发人员的首选工具之一。即时设计用户可以使用内置的工具和功能快速创建和编辑设计&#xff0c;或与其他用户共享和合作。此外&#xff0c;即时设计还有一个丰富的资源社区&#xff0c;为用…

制造业数字化转型的核心不止是技术

一、制造业的数字化转型意味着什么&#xff1f; 在当今的制造业领域&#xff0c;数字化转型意味着通过集成数字技术来增强传统的制造方法、产品和劳动力的过程。这些技术包括一系列创新&#xff0c;如自动化软件、电子商务系统、传感器、工业机器人等。 二、制造业数字化转型的…

ubuntu 安装apisix -亲测可用

官方未提供在ubuntu系统中安装apisix的方式&#xff0c;似乎只能通过源码方式安装&#xff0c;但是并不推荐&#xff0c;非常容易失败&#xff0c; 具体操作方式如下&#xff1a; ubuntu和Debian其实类似的&#xff0c;可使用DEB方式安装&#xff0c;如下截图 注意&#xff1…

22000mAh 电池,这款国产新机来了场「续航」震撼

见惯了主流智能手机&#xff0c;是时候上一波离谱新机震撼了。 三防手机这一细分类型&#xff0c;咱们普通用户可能接触得比较少&#xff1b; 但对于极限运动、野外探险爱好者来说&#xff0c;这玩意儿可是关键时候能救命的必备神器。 在真正严苛环境面前&#xff0c;性能啥的…

《Vue2.X 进阶知识点》- 防 ElementUI Divider 分割线

前言 使用 el-divider 背景为白色是没问题的。 但当背景换成其它颜色&#xff0c;问题就出现了&#xff01;&#xff01; 仔细看原来是两层&#xff0c;默认背景色是白色。 想着把背景色改为透明应该能用&#xff0c;结果发现背面是一条实线&#xff0c;难怪要用白色遮挡…不符…