基于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.mzph.cn/news/580577.shtml

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

相关文章

Web 3.0 是什么

第 1 章 明晰Web 3.0 从本章开始,就进入了本书的第一篇章,入门Web3.0,在第一篇章中将会让读者对Web3.0有一个整体的认知,为学习后面的章节打下基础。 在本章中,主要介绍的是Web的发展历史,包涵Web1.0、Web2.0、Web3.0的发展过程,以及资本为什么需要入场Web3.0、Web3.0…

遗传算法的应用——求解一元函数的极值

遗传算法的应用——求解一元函数的极值 1 基本概念2 预备知识3.1 模拟二进制转化为十进制的方法3.2 轮盘赌选择算法 3 问题4 Matlab代码5 运行效果6 总结 1 基本概念 遗传算法(Genetic Algorithm,GA)是模拟生物在自然环境中遗传和进化过程从而形成的随机全局搜索和优化方法&am…

1. pytorch mnist 手写数字识别

文章目录 一、数据集介绍1.1、简介1.2 详细介绍1、数据量2、标注量3. 标注类别4.数据下载5.数据集解读 二、读取、加载数据集1、pytorch 自带库函数2、通过重构Dataset类读取特定的MNIST数据或者制作自己的MNIST数据集 三、模型构建四、 runtraintest评估模型的性能检查点的持续…

Postman接口测试(附教程)

前言 之前还没实际做过接口测试的时候呢,对接口测试这个概念比较渺茫,只能靠百度,查看各种接口实例,然后在工作中也没用上,现在呢是各种各样的接口都丢过来…

2024,智能汽车走出独立曲线

文|刘俊宏 新能源汽车正在带领中国车市走向新的高峰。 在2023年,新能源汽车的增速显著超越整体车市。据中汽协预测,2023年,汽车总销量有望突破3000万辆,同比增长11.7%。其中,乘用车预计达到2600万辆&…

Web(10)XSS漏洞

XSS跨站脚本攻击 XSS是什么 XSS(cross-site-scripting) 即是跨站脚本攻击,是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端…

一条查询SQL是如何执行的?更新、新增、删除呢?

你好,我是田哥 本文共14629字,读完预计需要37分钟,建议先收藏。 大部分朋友估计都只知道写sql然后执行,但是并不知道MySQL背后到底是怎么实现的。 八股文中也有这么一道题:在MySQL中,一条SQL到底是如何执行…

【记录问题排查系列】记录CPU飙高问题排查过程篇(1)

CPU飙高问题排查 ✔️问题排查与解决✔️总结与思考 🍁前段时间我们新上了一个新的应用,因为流量一直不大,集群OPS大概只有5左右,写接口的t在30ms左右。 因为最近接入了新的业务,业务方给出的数据是日常QPS可以达到20…

无人职守自动安装linux操作系统

无人职守自动安装linux操作系统 1. 大规模部署案例2. PXE 技术3. Kickstart 技术4. 配置安装服务器4.1 DHCP服务4.2 TFTP 服务4.3 NFS服务 5. 示例5.1 搭建server1. 启动dhcp并设为开机自启2. 设置并启动tftp3. 将客户端所需启动文件复制到TFTP服务器4. 创建Kickstart自动应答文…

【IO】IO模型与零拷贝

前言: 正在运行的程序其实就是系统中的一个进程,操作系统会为每一个进程分配内存空间,而内存空间分为两部分,一部分是用户空间,这是用户进程访问的内存区域;另一部分是内核空间,是操作系统内核访…

20种常用的软件测试方法,建议先收藏再观看

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

简单的喷淋实验(2):(1)根据土壤湿度自动控制喷淋开关;(2)根据光照强度控制风扇以及灯的开关---嵌入式实训

目录 简单的喷淋实验(2): (1)根据土壤湿度自动控制喷淋开关; (2)根据光照强度控制风扇以及灯的开关---嵌入式实训 任务2: 具体过程: 所用的头文件: data_global.h …

gin框架使用系列之三——获取表单数据

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》 一、获取get参数 get请求的参数是直接加在url后面的,在gin中获取get请求的参数主要用Query()和DefaultQuery()两个方法,示例代码如下…

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。 我们创建地形很简单,在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型!这个模型是Unity内置的。 接下来的地形编辑功能全部集中在这个地形的组件上 主要功能如下&…

WPS中如何根据身份证号生成出生日期并排序

1. wps中如何根据身份证号导出出生日期并排序 1.1 wps中建一张表 1.2 使用转日期格式导出出生日期 DATE(VALUE(MID(C2,7,4)),VALUE(MID(C2,11,2)),VALUE(MID(C2,13,2)))MID(C2, 7, 4):这部分从单元格 C2 中提取文本字符串,从第7个字符开始提取长度为4的…

[python]python使用M-LSD直线检测算法onnx部署模型实时检测

介绍 github地址:https://github.com/navervision/mlsd LSD (M-LSD)一种用于资源受限环境的实时轻量线段检测器。它利用了极其高效的 LSD 架构和新颖的训练方案,包括 SoL 增强和几何学习方案。模型可以在GPU、CPU甚至移动设备上实时运行。算法已开源&a…

【elk-day01】es和kibana搭建及验证---Mac-Docker

Mac系统使用Docker下载搭建和验证eskibana Docker下载安装es安装es验证kibana安装kibana验证 Docker下载安装 Docker Desktop官网安装下载地址 说明一下为什么要安装desktop版本的docker,因为docker作为工具使用,我们需要的是开箱即用,没有必…

windows搭建MySQL 8.25主从配置

1.本次搭建的版本 mysql-8.0.25-win-x64 2.在解压完成后的文件内并没有对应的my.ini的配置文件这个my.ini是需要的主配置文件需要自行创建。 注:安装路径及数据存放路径需根据实际安装情况进行修改(其它配置信息可结合实际情况进行修改) 3.在…

vue+element实现动态表格:根据后台返回的属性名和字段动态生成可变表格

现有一个胡萝卜厂生产不同品种的胡萝卜,为了便于客户了解产品,现需在官网展示胡萝卜信息。现有的萝卜信息:编号(id)、名称(name)、保质期(age)、特点(remark&…

深度学习:计算机技术的革命性突破

深度学习:计算机技术的革命性突破 随着科技的飞速发展,深度学习已经成为计算机技术领域的一股强大力量。它改变了我们与机器的交互方式,为人工智能领域带来了革命性的突破。本篇博客将深入探讨深度学习的原理、应用和发展趋势。 一、深度学…