openGauss 5.0.0 数据库安全——全密态探究

前言

写此文章的目的,主要是验证:

  1. openGauss 5.0.0 数据库能够实现哪种加密方式的全密态

  2. 全密态数据库的特点

一、全密态介绍



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

由于整个业务数据流在数据处理过程中都是以密文形态存在,通过全密态数据库,可以实现:

  1. 1)保护数据在云上全生命周期的隐私安全。无论数据处于何种状态,攻击者都无法从数据库服务端获取有效信息。

  2. 2)帮助云服务提供商获取第三方信任。无论是企业服务场景下的业务管理员、运维管理员,还是消费者云业务下的应用开发者,用户通过将密钥掌握在自己手上,使得高权限用户无法获取数据有效信息。

  3. 3)让云数据库服务借助全密态能力更好的遵守个人隐私保护方面的法律法规。

全密态数据库目前支持两种连接方式:gsql连接和jdbc连接。

二、环境准备

本次实验使用的操作系统是centos7.9,openGauss版本是5.0.0,实验直接在一台服务器上面进行。

  1. 操作系统

  2. 数据库版本

三、实验过程

1、创建用户

使用管理员用户登录,然后参加一个qmttest用户,密码设置为"qwer1234!@#$"

CREATE USER qmttest PASSWORD 'qwer1234!@#$';

使用qmttest用户登录,连接密态数据库.

-C:是打开密态开关

gsql -p 15400 -d postgres -U qmttest -r -C

2、创建用户密钥

全密态数据库有两种密钥,即客户端主密钥CMK和数据加密密钥CEK。CMK用于加密CEK,CEK用于加密用户数据。密钥创建的顺序和依赖依次为:创建CMK > 创建CEK。

从这里开始验证加密方式的组合。

序号主密钥CMK数据加密密钥CEK1RSA_2048AEAD_AES_256_CBC_HMAC_SHA2562RSA_3072AEAD_AES_128_CBC_HMAC_SHA2563SM2SM4_SM32.1 创建客户端主密钥CMK

密钥存储路径:默认情况下,localkms将在(LOCALKMS_FILE_PATH)路径下生成/读取/删除密钥文件,用户可手动配置该环境变量。但是,用户也可以不用单独配置该环境变量,在尝试获取LOCALKMS_FILE_PATH失败时,localkms会尝试获取($GAUSSHOME/etc/localkms/)路径,如果该路径存在,则将其作为密钥存储路径。密钥相关文件名:使用CREATE CMK语法时,localkms将会创建四个与存储密钥相关的文件。示例:当KEY_PATH = “key_path_value”, 四个文件的名称分别为key_path_value.pub、key_path_value.pub.rand、 key_path_value.priv、 key_path_value.priv.rand。所以,为了能够成功创建密钥相关文件,在密钥存储路径下,应该保证没有已存在的与密钥相关文件名同名的文件。

2.1.1 RSA_2048

使用RSA_2048加密算法进行创新CMK名称:qmt_rsa2048CREATE CLIENT MASTER KEY qmt_rsa2048 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_rsa2048", ALGORITHM = RSA_2048);


查看生成的相应加密文件

2.1.2 RSA_3072

使用RSA_3072加密算法进行创建CMK名称:qmt_RSA3072CREATE CLIENT MASTER KEY qmt_RSA3072 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_RSA3072", ALGORITHM = RSA_3072);

查看生成的相应加密文件

2.1.3 SM2

使用SM2加密算法进行创建CMK名称:qmt_SM2CREATE CLIENT MASTER KEY qmt_SM2 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_SM2", ALGORITHM = SM2);


查看生成的相应加密文件

2.2 创建数据加密密钥CEK

2.2.1 AEAD_AES_256_CBC_HMAC_SHA256

使用 RSA_2048 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK名称:RSA_2048_256_CEKCREATE COLUMN ENCRYPTION KEY RSA_2048_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);
使用 RSA_3072 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK名称:RSA_3072_256_CEKCREATE COLUMN ENCRYPTION KEY RSA_3072_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);
使用 SM2 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK名称:SM2_256_CEK创建失败CREATE COLUMN ENCRYPTION KEY SM2_256_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

2.2.2 AEAD_AES_128_CBC_HMAC_SHA256

使用 RSA_2048 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK名称:RSA_2048_128_CEKCREATE COLUMN ENCRYPTION KEY RSA_2048_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);
使用 RSA_3072 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK

名称:RSA_3072_128_CEK

CREATE COLUMN ENCRYPTION KEY RSA_3072_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);


使用 SM2 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK名称:SM2_128_CEK创建失败CREATE COLUMN ENCRYPTION KEY SM2_128_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = AEAD_AES_128_CBC_HMAC_SHA256);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

2.2.3 SM4_SM3

使用 RSA_2048 + SM4_SM3 创建CEK名称:RSA_2048_SM4_SM3_CEK创建失败CREATE COLUMN ENCRYPTION KEY RSA_2048_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_rsa2048, ALGORITHM =SM4_SM3);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用


使用 RSA_3072 + SM4_SM3 创建CEK

名称:RSA_3072_SM4_SM3_CEK

创建失败

CREATE COLUMN ENCRYPTION KEY RSA_3072_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_RSA3072, ALGORITHM = SM4_SM3);

有报错

ERROR(CLIENT): National secret algorithm must be used together.

国家密码算法必须一起使用

使用 SM2 + SM4_SM3 创建CEK

名称:SM2_SM4_SM3_CEK

CREATE COLUMN ENCRYPTION KEY SM2_SM4_SM3_CEK WITH VALUES (CLIENT_MASTER_KEY = qmt_SM2, ALGORITHM = SM4_SM3);

2.3 总结

序号数据加密密钥CEK主密钥CMK组合名称是否创建成功1AEAD_AES_256_CBC_HMAC_SHA256RSA_2048RSA_2048_256_CEK2AEAD_AES_256_CBC_HMAC_SHA256RSA_3072RSA_3072_256_CEK3AEAD_AES_256_CBC_HMAC_SHA256SM2SM2_256_CEK4AEAD_AES_128_CBC_HMAC_SHA256RSA_2048RSA_2048_128_CEK5AEAD_AES_128_CBC_HMAC_SHA256RSA_3072RSA_3072_128_CEK6AEAD_AES_128_CBC_HMAC_SHA256SM2RSM2_128_CEK7SM4_SM3RSA_2048RSA_2048_SM4_SM3_CEK8SM4_SM3RSA_3072SA_3072_SM4_SM3_CEK9SM4_SM3SM2SM2_SM4_SM3_CEK

国密加密算法 SM2 SM4_SM3 不能和其他加密方式组合。

目前创建数据加密密钥CEK是成功的,下面进行使用测试。

3、表加密测试

3.1 使用RSA_2048_256_CEK创建加密表

  1. 表名称:RSA_2048_256_TB

CREATE TABLE RSA_2048_256_TB (id_number int, name text encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC));
  1. 插入数据

INSERT INTO RSA_2048_256_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_2048_256_TB VALUES (2,'joy','6219985678349800033');
  1. 客户端查询数据

select * from RSA_2048_256_TB;
  1. 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_2048_256_TB;


可以看出,数据已经加密。

加密成功,查询成功

3.2 使用RSA_3072_256_CEK创建加密表

名称:RSA_3072_256_TB

CREATE TABLE RSA_3072_256_TB (id_number int, name text encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC));
  1. 插入数据

INSERT INTO RSA_3072_256_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_3072_256_TB VALUES (2,'joy','6219985678349800033');
  1. 客户端查询数据

select * from RSA_3072_256_TB;
  1. 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_3072_256_TB;

3.3 使用RSA_2048_128_CEK创建加密表

名称:RSA_2048_128_TB

CREATE TABLE RSA_2048_128_TB (id_number int, name text encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC));
  1. 插入数据

INSERT INTO RSA_2048_128_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_2048_128_TB VALUES (2,'joy','6219985678349800033');
  1. 客户端查询数据

select * from RSA_2048_128_TB;
  1. 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_2048_128_TB;

3.4 使用RSA_3072_128_CEK创建加密表

名称:RSA_3072_128_TB

CREATE TABLE RSA_3072_128_TB (id_number int, name text encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC));
  1. 插入数据

INSERT INTO RSA_3072_128_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_3072_128_TB VALUES (2,'joy','6219985678349800033');
  1. 客户端查询数据

select * from RSA_3072_128_TB;
  1. 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from RSA_3072_128_TB;

3.5 使用SM2_SM4_SM3_CEK创建加密表

名称:SM2_SM4_SM3_TB

CREATE TABLE SM2_SM4_SM3_TB (id_number int, name text encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC));
  1. 插入数据

INSERT INTO SM2_SM4_SM3_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO SM2_SM4_SM3_TB VALUES (2,'joy','6219985678349800033');
  1. 客户端查询数据

select * from SM2_SM4_SM3_TB;
  1. 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from SM2_SM4_SM3_TB;

4、组合加密方式验证

同一个表中,不同的列使用不同的加密方式。

  1. 表名称:all_TB

说明:不同的列,使用不同的加密方式。
列id_number:不使用加密
列name1:RSA_2048_256_CEK,列credit_card1:RSA_3072_256_CEK,
列name2:RSA_2048_128_CEK,列credit_card2:RSA_3072_128_CEK,
列name3:SM2_SM4_SM3_CEK

CREATE TABLE all_TB (id_number int, name1 text encrypted with (column_encryption_key = RSA_2048_256_CEK, encryption_type = DETERMINISTIC),credit_card1 varchar(19) encrypted with (column_encryption_key = RSA_3072_256_CEK, encryption_type = DETERMINISTIC),name2 text encrypted with (column_encryption_key = RSA_2048_128_CEK, encryption_type = DETERMINISTIC),credit_card2 varchar(19) encrypted with (column_encryption_key = RSA_3072_128_CEK, encryption_type = DETERMINISTIC),name3 text encrypted with (column_encryption_key = SM2_SM4_SM3_CEK, encryption_type = DETERMINISTIC));
  1. 插入数据

INSERT INTO all_TB VALUES (1,'joe1','6217986500001288393','joe2','6217986500001288393','joe3');
INSERT INTO all_TB VALUES (2,'joy1','6219985678349800033','joy2','6219985678349800033','joy3');
  1. 客户端查询数据

select * from all_TB;
  1. 通过不加 -C 登录查询数据

gsql -p 15400 -d postgres -U qmttest -r
select * from all_TB;

四、总结

  1. 在openGauss 3.0 版本中,国密SM2+SM4_SM3组合使用中,在查询时,是有问题的,openGauss 5.0.0 这个版本中,这个问题已经解决。

  2. 同一个表中,列可以是加密的,也可以是不加密的。

  3. 同一个表中,可以有不同的加密方式。

  4. 想要查询到明文,客户端必须有密钥文件,密钥文件需要进行妥善保管。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容