「好文推荐」openGauss 5.0.0 数据库安全-全密态探究

前言

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

一、全密态介绍



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

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

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

二、环境准备

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

三、实验过程

1、创建用户

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

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

使用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创建加密表

  • 表名称: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));

  • 插入数据

INSERT INTO RSA_2048_256_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_2048_256_TB VALUES (2,'joy','6219985678349800033');

  • 客户端查询数据

select * from RSA_2048_256_TB;

  • 通过不加 -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));

  • 插入数据

INSERT INTO RSA_3072_256_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_3072_256_TB VALUES (2,'joy','6219985678349800033');

  • 客户端查询数据

select * from RSA_3072_256_TB;

  • 通过不加 -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));

  • 插入数据

INSERT INTO RSA_2048_128_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_2048_128_TB VALUES (2,'joy','6219985678349800033');

  • 客户端查询数据

select * from RSA_2048_128_TB;

  • 通过不加 -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));

  • 插入数据

INSERT INTO RSA_3072_128_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO RSA_3072_128_TB VALUES (2,'joy','6219985678349800033');

  • 客户端查询数据

select * from RSA_3072_128_TB;

  • 通过不加 -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));

  • 插入数据

INSERT INTO SM2_SM4_SM3_TB VALUES (1,'joe','6217986500001288393');
INSERT INTO SM2_SM4_SM3_TB VALUES (2,'joy','6219985678349800033');

  • 客户端查询数据

select * from SM2_SM4_SM3_TB;

  • 通过不加 -C 登录查询数据

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

4、组合加密方式验证

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

  • 表名称: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));

  • 插入数据

INSERT INTO all_TB VALUES (1,'joe1','6217986500001288393','joe2','6217986500001288393','joe3');
INSERT INTO all_TB VALUES (2,'joy1','6219985678349800033','joy2','6219985678349800033','joy3');

  • 客户端查询数据

select * from all_TB;

  • 通过不加 -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. 想要查询到明文,客户端必须有密钥文件,密钥文件需要进行妥善保管。


展开阅读全文

页面更新:2024-03-06

标签:数据库   组合   密钥   路径   客户端   名称   方式   文件   数据   用户

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top