---
title: 【好文推荐】openGauss 5.0.0 数据库安全——全密态探究-官方技术文章-鲲鹏社区
description: 本文主要向大家介绍openGauss 5.0.0数据库能够实现哪种加密方式的全密态以及全密态数据库的特点。
keywords: Gauss,好文推荐,数据库安全,全密态探究,官方技术文章,鲲鹏社区,前言,全密态介绍
url: https://www.hikunpeng.com/developer/techArticles/20231017-2?envFlag=1
section: (其他)
---

# 【好文推荐】openGauss 5.0.0 数据库安全——全密态探究-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20231017-2?envFlag=1
描述: 本文主要向大家介绍openGauss 5.0.0数据库能够实现哪种加密方式的全密态以及全密态数据库的特点。
关键词: Gauss,好文推荐,数据库安全,全密态探究,官方技术文章,鲲鹏社区,前言,全密态介绍

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

【好文推荐】openGauss 5.0.0 数据库安全——全密态探究

【好文推荐】openGauss 5.0.0 数据库安全——全密态探究

实战经验

发表于 2023/09/22

0

## 前言

写此文章的目的，主要是验证：

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

（2）全密态数据库的特点

## 全密态介绍

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

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

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

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

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

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

## 环境准备

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

（1）操作系统

（2）数据库版本

## 实验过程

### 1. 创建用户

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

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

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

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

-C：是打开密态开关

### 2. 创建用户密钥

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

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

| 序号 | 主密钥CMK | 数据加密密钥CEK |
| --- | --- | ---|
| 1 | RSA_2048 | AEAD_AES_256_CBC_HMAC_SHA256 |
| 2 | RSA_3072 | AEAD_AES_128_CBC_HMAC_SHA256 |
| 3 | SM2 | SM4_SM3 |

（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。所以，为了能够成功创建密钥相关文件，在密钥存储路径下，应该保证没有已存在的与密钥相关文件名同名的文件。

1）RSA_2048

使用RSA_2048加密算法进行创新CMK

名称：qmt_rsa2048

```
CREATE CLIENT MASTER KEY qmt_rsa2048 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_rsa2048", ALGORITHM = RSA_2048);
```

查看生成的相应加密文件

2）RSA_3072

使用RSA_3072加密算法进行创建CMK

名称：qmt_RSA3072

```
CREATE CLIENT MASTER KEY qmt_RSA3072 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_RSA3072", ALGORITHM = RSA_3072);
```

查看生成的相应加密文件

3）SM2

使用SM2加密算法进行创建CMK

名称：qmt_SM2

```
CREATE CLIENT MASTER KEY qmt_SM2 WITH (KEY_STORE = localkms , KEY_PATH = "qmt_SM2", ALGORITHM = SM2);
```

查看生成的相应加密文件

（2）创建数据加密密钥CEK

1）AEAD_AES_256_CBC_HMAC_SHA256

使用 RSA_2048 + AEAD_AES_256_CBC_HMAC_SHA256 创建CEK

名称：RSA_2048_256_CEK

```
CREATE 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_CEK

```
CREATE 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）AEAD_AES_128_CBC_HMAC_SHA256

使用 RSA_2048 + AEAD_AES_128_CBC_HMAC_SHA256 创建CEK

名称：RSA_2048_128_CEK

```
CREATE 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.
```

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

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);
```

（3）总结

| 序号 | 数据加密密钥CEK | 主密钥CMK | 组合名称 | 是否创建成功 |
| --- | --- | --- | --- | ---|
| 1 | AEAD_AES_256_CBC_HMAC_SHA256 | RSA_2048 | RSA_2048_256_CEK | 是 |
| 2 | AEAD_AES_256_CBC_HMAC_SHA256 | RSA_3072 | RSA_3072_256_CEK | 是 |
| 3 | AEAD_AES_256_CBC_HMAC_SHA256 | SM2 | SM2_256_CEK | 否 |
| 4 | AEAD_AES_128_CBC_HMAC_SHA256 | RSA_2048 | RSA_2048_128_CEK | 是 |
| 5 | AEAD_AES_128_CBC_HMAC_SHA256 | RSA_3072 | RSA_3072_128_CEK | 是 |
| 6 | AEAD_AES_128_CBC_HMAC_SHA256 | SM2 | RSM2_128_CEK | 否 |
| 7 | SM4_SM3 | RSA_2048 | RSA_2048_SM4_SM3_CEK | 否 |
| 8 | SM4_SM3 | RSA_3072 | SA_3072_SM4_SM3_CEK | 否 |
| 9 | SM4_SM3 | SM2 | SM2_SM4_SM3_CEK | 是 |

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

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

### 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));
```

1）插入数据

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

2）客户端查询数据

```
select * from RSA_2048_256_TB;
```

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

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

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

加密成功，查询成功

（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');
```

2）客户端查询数据

```
select * from RSA_3072_256_TB;
```

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

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

（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');
```

2）客户端查询数据

```
select * from RSA_2048_128_TB;
```

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

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

（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');
```

2）客户端查询数据

```
select * from RSA_3072_128_TB;
```

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

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

（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');
```

2）客户端查询数据

```
select * from SM2_SM4_SM3_TB;
```

3）通过不加 -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));
```

1）插入数据

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

2）客户端查询数据

```
select * from all_TB;
```

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

本页内容
