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

基于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  | 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
      [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=> \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全密态等值查询到此结束,感谢大家查阅,希望对你们有所帮助!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【经验分享】日常开发中的故障排查经验分享(一)

目录 简介CPU飙高问题1、使用JVM命令排查CPU飙升100%问题2、使用Arthas的方式定位CPU飙升问题3、Java项目导致CPU飙升的原因有哪些?如何解决? OOM问题(内存溢出)1、如何定位OOM问题?2、OOM问题产生原因 死锁问题的定位…

利用html2Canvas将表格下载为html

给到我的需求是点击按钮时请求后端接口,根据后端返回的数据,生成表格,并将表格的内容直接下载为html,如下图。 平常做的下载都是后端返回二进制流,这次前端做下载那就必须把页面先画出来,因为下载下来的表格在页面上是不显示的&a…

[RoarCTF2019] TankGame

不多说,用dnspy反编译data文件夹中的Assembly-CSharp文件 使用分析器分析一下可疑的FlagText 发现其在WinGame中被调用,跟进WinGame函数 public static void WinGame(){if (!MapManager.winGame && (MapManager.nDestroyNum 4 || MapManager.n…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言,最重要的语句 4.使用频率最高的语句 语法: SELECT 字段1,字段2,……FROM 表 有时候…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束:any三、支持比较操作的内置约束:comparable四、自定义约束五、类型集合(type set)六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

Jenkins Tutorial

什么是Jenkins Jenkins是一个自动化平台,它允许你使用pipelines去部署应用。它也可以自动化其他任务。 BUILDTESTDEPLOYMENT Jenkins 架构 首先,你拥有一个Master Server,它控制pipelines和安排Build到你的Agent上; 其次&…

c++环形缓冲区学习

C环形缓冲区设计与实现:从原理到应用的全方位解析 - 知乎 这里插入一个回调函数的学习: C回调函数详解_c 回调函数-CSDN博客 【C】C回调函数基本用法(详细讲解)_c 回调函数-CSDN博客

手机卡为什么要关闭语音功能?看完这篇文章瞬间就懂了!

今天给大家介绍一种流量卡行业中的奇怪的现象,那么就是我明明办理的是正规的号卡,为什么却给我关闭了语音功能吗? 很多朋友都想办理一张正规的,可以打电话,可以发短信的流量卡,但是在拿到流量卡之后才发现卡…

openmediavault(OMV) (19)云相册(3)mt-photos

简介 MT Photos是一款为Nas用户量身打造的照片管理系统。通过AI技术,自动将您的照片整理、分类,包括但不限于时间、地点、人物、照片类型。可以在任何支持Docker的系统中运行它。详情可查看mtmt.tech官网,mt-photos是付费订阅使用的,也可以一次性付费永久使用,具体使用mt…

web3方向产品调研

每次互联网形态的改变,都会对世界产生很大的影响,上一次对社会产生重大影响的互联网形态(Web2.0)催生了一批改变人类生活和信息交互方式的企业。 目录 概述DAO是什么?为什么我们需要DAO? 金融服务金融桥接及周边服务D…

2023年最值得关注的主要网络犯罪统计数据

在互联网高速发展的当今,网络犯罪的种类和数量日益增长,为了保护自身的利益与安全,了解和关注网络犯罪的最新统计数据很有必要。本文汇总了2023年最值得关注的主要网络犯罪统计数据,以帮助企业了解未来趋势与防范启示,…

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能,这里记录下部分功能,主要用到的是freemarker框架,spring就有带,我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…

Unity Shader-真实下雨路面

Unity Shader-真实下雨路面 简介素材1.准备插件Amplify Shader Editor(这里我使用的是1.6.4最新版)2.贴纸和切图d 一、创建一个Shader Surface,实现气泡播放效果二、叠加一次气泡播放效果,使其看起来更多,更无序三、小…

学生使用什么牌子的护眼灯好?五款优秀台灯分享

在近几年,儿童青少年近视率非常高。很多家长认为孩子近视的原因是没有养成正确的用眼习惯,例如经常趴桌子写作业、眯眼看书等,但实际上这些坏习惯是因为没有合适的光线而导致的。所以安排一盏合适的台灯给孩子学习是非常重要的。 很多家长会选…

GitHub教程-自定义个人页制作

GitHub是全球最大的代码托管平台,除了存放代码,它还允许用户个性化定制自己的主页,展示个人特色、技能和项目。本教程旨在向GitHub用户展示如何制作个性化主页,同时,介绍了GitHub Actions的应用,可以自动化…

Docker 使用详解看了挺开悟的

使用docker ps命令可以查看所有正在运行中的容器列表, 使用docker inspect命令我们可以查看更详细的关于某一个容器的信息。 $ docker inspect 容器id/image[{"Id": "b57ee6bbf1f4f62a5aba6a73acd53b0f9b8ec542e1f9fa9213159ffd3828c7b4",&q…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件: PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…

Mybatis行为配置之Ⅲ—其他行为配置项说明

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

华为云服务器yum无更新问题解决

买了一个华为云服务器,系统是银河麒麟v10,cpu选择的事华为的坤鹏。 买了一段时间后,使用yum更新,发现没有任何更新包。 又过了一段时间,还是没有更新包。 通过漏扫设备,发现系统内存在较多存在漏洞的软件…