一.全密态数据库特性简介
全密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效的价值信息,从而起到保护数据隐私的能力。
二. 全密态数据库的客户价值
由于整个业务数据流在数据处理过程中都是以密文形态存在,通过全密态数据库,可以实现:
- 保护数据在云上全生命周期的隐私安全,无论数据处于何种状态,攻击者都无法从数据库服务端获取有效信息。
- 帮助云服务提供商获取第三方信任,无论是企业服务场景下的业务管理员、运维管理员,还是消费者云业务下的应用开发者,用户通过将密钥掌握在自己手上,使得高权限用户无法获取数据有效信息。
- 让云数据库服务借助全密态能力更好的遵守个人隐私保护方面的法律法规。
三.全密态数据库的使用
全密态数据库目前支持两种连接方式:gsql连接和jdbc连接。本章将从四个步骤详细介绍两种连接方式下,数据库的使用流程。
3.1连接全密态数据库
1.GSQL连接数据库执行以下命令打开密态开关:gsql -p PORT –d postgres -r –C
参数说明
-p端口号,-d数据库名称 –C是打开密态开关。
2.JDBC支持密态数据库相关操作,需要设置enable_ce=1
3.2创建用户密钥
全密态数据库有两种密钥,即客户端主密钥CMK和数据加密密钥CEK。CMK用于加密CEK,CEK用于加密用户数据。
在创建密钥之前,首先要使用gs_ktool工具创建密钥ID,此ID用于创建客户端主密钥CMK:
代码语言:javascript复制openGauss=# ! gs_ktool -g
密钥创建的顺序和依赖依次为:创建密钥IDà创建CMKà创建CEK。
1. GSQL环境下创建CMK和CEK:
【创建CMK】
代码语言:javascript复制CREATE CLIENT MASTER KEY
client_master_key_name WITH (KEY_STORE =
key_store_name, KEY_PATH = "key_path_value",
ALGORITHM = algorithm_type);
参数说明
• client_master_key_name
该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束。
取值范围:字符串,需符合标识符的命名规范。
• KEY_STORE
独立管理密钥的工具/服务。目前,仅支持由GaussDB Kenel提供的密钥管理工具gs_ktool,以及由华为云提供的在线密钥管理服务huawei_kms。取值范围为:gs_ktool,huawei_kms。
• KEY_PATH
用于指定密钥管理工具/服务中的一个密钥。通过KEY_STORE和KEY_PATH参数可唯一确定一个密钥实体。当KEY_STORE = gs_ktool时,取值范围为:gs_ktool/KEY_ID;当KEY_STORE = huawei_kms时,取值范围为:36字节的密钥ID。
• ALGORITHM
用于指定该密钥实体将用于何种加密算法。当KEY_STORE = gs_ktool时,取值范围为:AES_256_CBC,SM4;当KEY_STORE = huawei_kms时,取值为:AES_256。
【创建CEK】
代码语言:javascript复制CREATE COLUMN ENCRYPTION KEY column_encryption_key_name
WITH(CLIENT_MASTER_KEY = client_master_key_name, ALGORITHM = algorithm_type,
ENCRYPTED_VALUE = encrypted_value);
参数说明
• column_encryption_key_name
该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束。
取值范围:字符串,要符合标识符的命名规范。
• CLIENT_MASTER_KEY
指定用于加密本CEK的CMK,取值为:CMK对象名,该CMK对象由CREATE CLIENT MASTER KEY语法创建。
• ALGORITHM
指定该CEK将用于何种加密算法,取值范围为:AEAD_AES_256_CBC_HMAC_SHA256、AEAD_AES_128_CBC_HMAC_SHA256和SM4_SM3;
• ENCRYPTED_VALUE(可选项)
该值为用户指定的密钥口令,密钥口令长度范围为28 ~ 256位,28位派生出来的密钥安全强度满足AES128,若用户需要用AES256,密钥口令的长度需要39位,如果不指定,则会自动生成256比特的密钥。
说明:
由于SM2、SM3、SM4等算法属于中国国家密码标准算法,为规避法律风险,需配套使用。即如果将CEK用于SM4_SM3算法,则仅能使用SM4算法来对该CEK进行加密。
【示例:GSQL环境下:】
代码语言:javascript复制--(1)使用密钥管理工具gs_ktool创建密钥,该工具会返回新生成的密钥的ID
[cmd] gs_ktool -g
-- (2) 使用特权账户,创建一个普通用户alice。
openGauss=# CREATE USER alice PASSWORD '********';
-- (3)使用普通用户alice的账户,连接密态数据库,并执行本语法
gsql -p 57101 postgres -U alice -r -C
-- 创建客户端加密主密钥(CMK)对象
openGauss=> CREATE CLIENT MASTER KEY alice_cmk WITH ( KEY_STORE
= gs_ktool , KEY_PATH = "gs_ktool/1" , ALGORITHM = AES_256_CBC);
-- 创建客户端列加密密钥(CEK)对象
openGauss=> CREATE COLUMN ENCRYPTION KEY a_cek WITH VALUES
(CLIENT_MASTER_KEY = a_cmk, ALGORITHM =
AEAD_AES_256_CBC_HMAC_SHA256);
openGauss=> CREATE COLUMN ENCRYPTION KEY another_cek WITH VALUES
(CLIENT_MASTER_KEY = a_cmk, ALGORITHM = SM4_SM3);
2. JDBC环境下创建CMK和CEK:
代码语言:javascript复制// 创建客户端主密钥
Connection conn =
DriverManager.getConnection("url","user","password");
Statement stmt = conn.createStatement();
int rc = stmt.executeUpdate("CREATE CLIENT MASTER KEY ImgCMK1 WITH
( KEY_STORE = gs_ktool , KEY_PATH = "gs_ktool/1" , ALGORITHM =
AES_256_CBC);");
// 创建列加密密钥
int rc2 = stmt.executeUpdate("CREATE COLUMN ENCRYPTION KEY ImgCEK1
WITH VALUES (CLIENT_MASTER_KEY = ImgCMK1, ALGORITHM =
AEAD_AES_256_CBC_HMAC_SHA256);");
3.3创建加密表
在创建了客户端主密钥CMK和数据加密密钥CEK之后,就可以使用CEK创建加密表了。加密表的创建支持对加密列进行随机加密和确定性加密两种· 123··方式。
1. GSQL连接环境下创建加密表:
【示例】
代码语言:javascript复制openGauss=# CREATE TABLE creditcard_info (id_number int,
name text encrypted with (column_encryption_key = ImgCEK,
encryption_type = DETERMINISTIC),
credit_card varchar(19) encrypted with (column_encryption_key =
ImgCEK1, encryption_type = DETERMINISTIC));
参数说明
ENCRYPTION_TYPE为ENCRYPTED WITH约束中的加密类型,encryption_type_value的值为[ DETERMINISTIC | RANDOMIZED ]。
2. JDBC环境下创建加密表:
代码语言:javascript复制int rc3 = stmt.executeUpdate("CREATE TABLE creditcard_info
(id_number int, name varchar(50) encrypted with
(column_encryption_key = ImgCEK1, encryption_type =
DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = ImgCEK1, encryption_type =
DETERMINISTIC));");
3.4向加密表插入数据并进行查询
创建了加密表以后,可以在密态数据库模式下(连接参数-C)向加密表中插入数据、查看数据。当使用普通环境(关掉连接参数-C)时,是无法对加密表进行操作的,查看加密表时也只能看到密文数据。
1. GSQL环境下向加密表插入数据并查看:
代码语言:javascript复制openGauss=# INSERT INTO creditcard_info VALUES
(1,'joe','6217986500001288393');
INSERT 0 1
openGauss=# INSERT INTO creditcard_info VALUES (2,
'joy','6219985678349800033');
INSERT 0 1
openGauss=# select * from creditcard_info where name = 'joe';
id_number | name | credit_card
----------- ------ ---------------------
1 | joe | 6217986500001288393
(1 row)
注意:使用非密态客户端查看该加密表数据时是密文
代码语言:javascript复制openGauss=# select id_number,name from creditcard_info;
id_number | name
----------- -------------------------------------------
1 | x011aefabd754ded0a536a96664790622487c4d36
2 | x011aefabd76853108eb406c0f90e7c773b71648f
(2 rows)
2. JDBC环境下向加密表插入数据并查看:
代码语言:javascript复制// 插入数据
int rc4 = stmt.executeUpdate("INSERT INTO creditcard_info VALUES
(1,'joe','6217986500001288393');");
// 查询加密表
ResultSet rs = null;
rs = stmt.executeQuery("select * from creditcard_info where name =
'joe';");
// 关闭语句对象
stmt.close();
上述我们列出的是全密态数据库特性的基本使用方法,更全面的使用介绍,可以参考官方文档中的对应章节。但对于普通用户来说,上述介绍的功能足以保证日常工作的顺利开展。后续,全密态数据库也会沿着更加易用、更高的性能进行演进,也欢迎大家持续关注!