更新时间:2024-10-14 GMT+08:00

CREATE CLIENT MASTER KEY

功能描述

创建一个客户端主密钥对象,该对象可用于加密Column Encryption Key对象。

注意事项

本语法属于全密态数据库特有语法。

当使用gsql连接数据库服务器时,需使用‘-C’参数,打开全密态数据库的开关,才能使用本语法。

由本语法创建的CMK对象中,仅存储从独立的密钥管理工具/服务/组件中读取密钥的方法,而不存储密钥本身。

语法格式

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提供的密钥管理工具gs_ktool,以及由华为云提供的在线密钥管理服务huawei_kms。取值范围为:gs_ktool,huawei_kms。

    由于我们仅在客户端与KEY_STORE进行交互,当使用不同的客户端时,本语法中KEY_STORE参数支持的类型也不尽相同。当使用gsql执行本语法时,KEY_STORE仅支持gs_ktool,当使用JDBC执行本语法时,KEY_STORE仅支持huawei_kms。

  • KEY_PATH
    用于指定密钥管理工具/服务中的一个密钥。通过KEY_STORE和KEY_PATH参数可唯一确定一个密钥实体。当KEY_STORE = gs_ktool时,取值范围为:gs_ktool/KEY_ID;当KEY_STORE = huawei_kms时,取值范围为:36字节的密钥ID。

    由该语法创建的CMK对象中,存储了KEY_STORE和KEY_PATH信息。当需要读取密钥实体时,GaussDB能够根据CMK对象中存储的信息,自动地从指定KEY_STORE中读取指定的密钥实体。因此,在本语法中,KEY_PATH参数应指向一个已经存在的密钥实体。

  • ALGORITHM

    用于指定该密钥实体将用于何种加密算法。当KEY_STORE = gs_ktool时,取值范围为:AES_256_CBC,SM4;当KEY_STORE = huawei_kms时,取值为:AES_256。

示例(在使用gsql连接数据库服务器的场景下)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
-- (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
gsql((GaussDB Kernel VxxxRxxxCxx build f521c606) compiled at 2021-09-16 14:55:22 commit 2935 last mr 6385 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=>

-- 创建客户端加密主密钥(CMK)对象
openGauss=> CREATE CLIENT MASTER KEY alice_cmk WITH ( KEY_STORE = gs_ktool , KEY_PATH = "gs_ktool/1" , ALGORITHM = AES_256_CBC);

示例(在使用JDBC连接数据库服务器的场景下)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* 
 * (1) 登录华为云官网(https://www.huaweicloud.com),进入“控制台”-“服务列表”-“数据加密服务 DEW”- “密钥管理”页面,创建一个密钥。
 *     该服务即由华为云提供的密钥管理服务——KMS。当然,你还可通过编程接口进行密钥管理,详情请参考华为云公开文档 :
 *    (https://support.huaweicloud.com/dew_faq/dew_01_0053.html)
 */

/* 
 *(2)与数据库服务器建立连接并执行本语法,在url中需开启全密态数据库的开关:enable_ce=1
 *      说明:本部分代码作为示例代码,仅考虑通过最少代码实现最基本的功能
 */
import java.sql.*;

public class CrtCmkTest {
    public static void main(String[] args) {
        String driver = "org.postgresql.Driver";
        try {
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        /* 用于与数据库服务器建立连接的信息 */
        String dbUrl = "jdbc:postgresql://localhost:19900/postgres?enable_ce=1";
        String dbUser = "alice";
        String dbPassword = "********";

       /* 
        * 用于访问华为云KMS的身份认证信息与KMS项目信息
        * 说明:本部分所有参数,均可在华为云官网“控制台”-“我的凭证”页面找到
        */
        String iamUser = "alice_for_kms";
        String iamPassword = "********";
        String kmsDomain = "hw00000000";
        String kmsProjectName = "cn-east-3";
        String kmsProjectId = "00000000000000000000000000000000";

        /* 用于创建CMK密钥对象的SQL语句 */
        String sql = "CREATE CLIENT MASTER KEY alice_cmk WITH ( " + 
         "KEY_STORE = huawei_kms, KEY_PATH = \"00000000-0000-0000-0000-000000000000\" , ALGORITHM = AES_256);";

        try {
            Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
            conn.setClientInfo("iamUser", iamUser);
            conn.setClientInfo("iamPassword", iamPassword);
            conn.setClientInfo("kmsDomain", kmsDomain);
            conn.setClientInfo("kmsProjectName", kmsProjectName);
            conn.setClientInfo("kmsProjectId", kmsProjectId );
            Statement stmt = conn.createStatement();
            System.out.println("results: " + stmt.executeUpdate(sql));
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}