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(); } } } |