openGauss数据库源码解析系列文章—安全管理源码解析(六)

openGauss数据库源码解析系列文章—安全管理源码解析(六)

六、数据安全技术

openGauss采用了多种加密解密技术来提升数据在各个环节的安全性。

6.1 数据加解密接口

用户在使用数据库时,除了需要基本的数据库安全之外,还会对导入的数据进行加密和解密的操作。openGauss提供了针对用户导入数据进行加密和解密的功能接口,用户使用该接口可以对其认为包含敏感信息的数据进行加密和解密操作。

1. 数据加密接口

openGauss提供的加密功能是基于标准的AES128加密算法进行实现,提供的加密接口函数为:

gs_encrypt_aes128 (encryptstr, keystr)

其中keystr是用户提供的密钥明文,加密函数通过标准的AES128加密算法对encryptstr字符串进行加密,并返回加密后的字符串。keystr的长度范围为1~16字节。加密函数支持的加密数据类型包括数值类型、字符类型、二进制类型中的RAW、日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME等。

加密函数返回的的密文值长度:至少为92字节,不超过4*[(Len+68)/3]字节,其中Len为加密前数据长度(单位为字节)。

使用示例如下:

opengauss=# CREATE table student005 (name text);opengauss=# INSERT into student005 values(gs_encrypt_aes128('zhangsan','gaussDB123'));INSERT 0 1opengauss=# SELECT * FROM student005;                                             name----------------------------------------------------------------------------------------------NrGJdx8pDgvUSE2NN7eM5mFDnSSJ41fq31/0SI2+4kABgOnCu9H2vkjpvcAdG/AhJ8OrBn906Xaj6oqyEHsTbcTvjrU= (1 row)

加密接口函数是通过函数gs_encrypt_aes128实现的,其代码源文件为:“builtins.h”和“cipherfn.cpp”。

该函数是一个openGauss的存储过程函数,通过用户输入的明文和密钥进行数据的加密操作。

主要流程如图29所示。

图片

图29 数据加密流程

2. 数据解密接口

openGauss提供的解密接口函数为:

gs_decrypt_aes128 (decryptstr, keystr)

以keystr为用户加密密钥对decryptstr加密字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。

使用示例如下。

opengauss=# SELECT gs_decrypt_aes128(name,'gaussDB123') FROM student005; gs_decrypt_aes128------------------- zhangsan(1 row)

解密接口函数是通过函数gs_decrypt_aes128实现的,其代码源文件为:“builtins.h”和“cipherfn.cpp”。

该函数是一个openGauss的存储过程函数,通过用户输入的密文(注明文加密生成的密文)和密钥进行数据的解密操作。

主要流程如图30所示。

图片

图30 数据解密流程

数据解密的代码如下逐个部分介绍。

通过存储过程的入参解析出需要解密的密文和密钥,并进行脱敏的decode操作。

开始将密文转换为明文过程。相关代码如下:

bool gs_decrypt_aes_speed(GS_UCHAR* ciphertext, GS_UINT32 cipherlen, GS_UCHAR* key, GS_UCHAR* plaintext, GS_UINT32* plainlen)……

将密文进行解码操作,分离密文和信息两个部分。

6.2 数据动态脱敏

数据脱敏,顾名思义就是将敏感数据通过变形、屏蔽等方式处理,其目的是保护隐私数据信息,防止数据泄露和恶意窥探。当企业或者机构收集用户个人身份数据、手机、银行卡号等敏感信息,然后将数据通过导出(非生产环境)或直接查询(结合生产环境)的方式投入使用时,按照隐私保护相关法律法规需将数据进行“脱敏”处理。

openGauss实现了数据动态脱敏机制,它根据一系列用户配置的“脱敏策略”来对查询命令进行分析匹配,最终将敏感数据屏蔽并返回。使用数据动态脱敏特性总的来说分为两个步骤:配置脱敏策略、触发脱敏策略。本小节将对这两个步骤进行具体分析。

显然只有在配置脱敏策略后系统才能有根据地进行敏感数据脱敏。openGauss提供了脱敏策略配置(创建、修改、删除)语法,这些语法所涉及的语法解析节点内容大致相同,因此这里仅对创建策略相关数据结构进行分析,其余不再赘述。下面将结合一个具体示例对数据动态脱敏特性进行详细介绍。

表6给出了一张包含敏感信息(薪资、银行卡号)的个人信息表,策略管理员要对该表中的敏感信息创建脱敏策略:当用户user1或user2在IP地址10.123.123.123上使用JDBC或gsql连接数据库并查询个人信息表时,系统将自动屏蔽敏感信息。

表6 个人信息表person

id name gen
### OpenGauss 数据库中临时表的源码解析 #### 临时表的概念与作用 临时表是在会话期间创建的一种特殊类型的表,仅对该会话可见。当会话结束时,临时表及其数据会被自动删除。这种特性使得临时表非常适合用于中间计算结果的存储。 #### 源码中的实现细节 在OpenGauss数据库中,临时表的管理主要由`ExecEndRecursiveUnion`函数处理的一部分逻辑来完成[^1]。该函数不仅负责清理递归查询过程中产生的资源,还涉及到了临时表的相关操作。具体来说: - **内存分配与释放**:对于临时表而言,在其生命周期内可能会涉及到大量的内存分配和释放工作。为了提高效率并减少碎片化问题,OpenGauss采用了特定的数据结构来进行管理和优化。 - **哈希表的应用**:特别是在去重场景下,系统利用了高效的哈希表机制来跟踪已经存在的记录,从而确保同一事务内的唯一性约束得到满足。 ```sql CREATE TEMPORARY TABLE temp_table ( id INT PRIMARY KEY, name VARCHAR(50) ); ``` 这段SQL语句展示了如何在一个具体的会话中创建一个名为`temp_table`的临时表,并定义了一个整数类型的主键字段`id`以及一个字符串类型的字段`name`。 #### 日志记录方式 值得注意的是,尽管临时表具有短暂的存在周期,但在某些情况下仍然会产生相应的日志条目。这些日志通常是以行级别的形式被记录下来,而不是像普通持久化对象那样依赖于更底层的物理页变更描述[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值