Erlo

openGauss数据库源码解析系列文章——数据安全技术(上)

2021-12-07 11:00:27 发布   386 浏览  
页面报错/反馈
收藏 点赞

在前面文章中介绍过“9.5 审计与追踪”,本篇我们介绍第9章 安全管理源码解析中“9.6 数据安全技术”的相关精彩内容介绍。
openGauss采用了多种加密解密技术来提升数据在各个环节的安全性。

9.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 1
opengauss=# SELECT * FROM student005;
                                             name
----------------------------------------------------------------------------------------------
NrGJdx8pDgvUSE2NN7eM5mFDnSSJ41fq31/0SI2+4kABgOnCu9H2vkjpvcAdG/AhJ8OrBn906Xaj6oqyEHsTbcTvjrU= 
(1 row)

加密接口函数是通过函数gs_encrypt_aes128实现的,其代码源文件为:“builtins.h”和“cipherfn.cpp”。
该函数是一个openGauss的存储过程函数,通过用户输入的明文和密钥进行数据的加密操作。主要流程如图9-29所示。
在这里插入图片描述

                               图9-29  数据加密流程

数据加密的代码如下逐个部分介绍。
将明文转换为密文相关代码如下:

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

获取随机salt值,获取派生密钥,相关代码如下:

/* bool gs_encrypt_aes_speed函数: */
/* 使用存在的随机salt值 */
    static THR_LOCAL GS_UCHAR random_salt_saved[RANDOM_LEN] = {
   0};
    static THR_LOCAL bool random_salt_tag = false;
    static THR_LOCAL GS_UINT64 random_salt_count = 0;

    /* 对随机salt值的使用次数限制 */
    const GS_UINT64 random_salt_count_max = 24000000;

    if (random_salt_tag == false || random_salt_count > random_salt_count_max) {
   
        /* 加密获取随机salt值 */
        retval = RAND_bytes(init_rand, RANDOM_LEN);
        if (retval != 1) {
   
            (void)fprintf(stderr, _("generate random key failed,errcode:%un"), retval);
            return false;
        }
        random_salt_tag = true;
        errorno = memcpy_s(random_salt_saved, RANDOM_LEN, init_rand, RANDOM_LEN);
        securec_check(errorno, "
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认