openGauss学习笔记-55 openGauss 高级特性-全密态数据库

openGauss学习笔记-55 openGauss 高级特性-全密态数据库55.1 连接全密态数据库55.2 创建用户密钥55.3 创建加密表55.4 向加密表插入数据并进行查询

openGauss学习笔记-55 openGauss 高级特性-全密态数据库

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

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

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

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

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

全密态数据库目前支持两种连接方式:gsql连接和jdbc连接。下面将详细介绍两种连接方式下数据库的使用流程。

55.1 连接全密态数据库

  • GSQL连接数据库执行以下命令打开密态开关:
gsql -p PORT -d postgres -r -C
参数说明:

*   -p:端口号

*   -d:数据库名称

*   -C:是打开密态开关。
  • JDBC支持密态数据库相关操作,需要设置enable_ce=1

55.2 创建用户密钥

全密态数据库有两种密钥,即客户端主密钥CMK和数据加密密钥CEK。CMK用于加密CEK,CEK用于加密用户数据。

密钥创建的顺序和依赖依次为: 创建CMK > 创建CEK。

  • GSQL环境下创建CMK和CEK:

    【创建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**

    指定管理CMK的密钥工具或组件;取值:目前仅支持localkms。

*   **KEY_PATH**

    KEY_STORE负责管理多个CMK密钥,KEY_PATH选项用于在KEY_STORE中唯一标识CMK。取值类似:“key_path_value”。

*   **ALGORITHM**

    由本语法创建的用于加密COLUMN ENCRYPTION KEY,该参数用于指定加密算法的类型。取值范围:RSA_2048、RSA3072和SM2。

> [图片上传失败...(image-1e6093-1693402489987)]
> 
>   **说明:** 密钥存储路径:默认情况下,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。 所以,为了能够成功创建密钥相关文件,在密钥存储路径下,应该保证没有已存在的与密钥相关文件名同名的文件。

**【创建CEK】**
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比特的密钥。

> [图片上传失败...(image-b17c6d-1693402489987)]
> 
>   **说明:** 由于SM2、SM3、SM4等算法属于中国国家密码标准算法,为规避法律风险,需配套使用。如果创建CMK时指定SM4算法来加密CEK,则创建CEK时必须指定SM4_SM3算法来加密数据。

**【示例:GSQL环境下:】**
-- 创建$GAUSSHOME/etc/localkms/路径
    mkdir -p $GAUSSHOME/etc/localkms/
    -- 使用特权账户,创建一个普通用户alice。
     openGauss=# CREATE USER alice PASSWORD '********'; 
    -- 使用普通用户alice的账户,连接密态数据库,并执行本语法。
     gsql -p 57101 postgres -U alice -r -C 
    -- 创建客户端加密主密钥(CMK)对象。
     openGauss=> CREATE CLIENT MASTER KEY alice_cmk WITH (KEY_STORE = localkms , KEY_PATH = "key_path_value”, ALGORITHM = RSA_2048); 
    -- 创建客户端列加密密钥(CEK)对象。
     openGauss=> CREATE COLUMN ENCRYPTION KEY ImgCEK WITH VALUES (CLIENT_MASTER_KEY = alice_cmk, ALGORITHM  = AEAD_AES_256_CBC_HMAC_SHA256); 
  • JDBC环境下创建CMK和CEK:
// 创建客户端主密钥
     Connection conn = DriverManager.getConnection("url","user","password");Statement stmt = conn.createStatement();int rc = stmt.executeUpdate("CREATE CLIENT MASTER KEY ImgCMK1 WITH ( KEY_STORE = localkms , KEY_PATH = "key_path_value" , 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);");

55.3 创建加密表

在创建了客户端主密钥CMK和数据加密密钥CEK之后,就可以使用CEK创建加密表了。加密表的创建支持对加密列进行随机加密和确定性加密两种方式。

  • GSQL连接环境下创建加密表:

    【示例】

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 = ImgCEK, encryption_type = DETERMINISTIC));
参数说明

ENCRYPTION_TYPE为ENCRYPTED WITH约束中的加密类型,encryption_type_value的值为[ DETERMINISTIC | RANDOMIZED ]。
  • JDBC环境下创建加密表:
int rc3 = stmt.executeUpdate("CREATE TABLE creditcard_info (id_number    int, name  varchar(50) encrypted with (column_encryption_key = ImgCEK, encryption_type = DETERMINISTIC),credit_card  varchar(19) encrypted with (column_encryption_key = ImgCEK1, encryption_type = DETERMINISTIC));");

55.4 向加密表插入数据并进行查询

创建了加密表以后,可以在密态数据库模式下(连接参数-C)向加密表中插入数据、查看数据。当使用普通环境(关掉连接参数-C)时,是无法对加密表进行操作的,查看加密表时也只能看到密文数据。

  • GSQL环境下向加密表插入数据并查看:
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)
> [图片上传失败...(image-30da5a-1693402489987)]
> 
>   **说明:** 使用非密态客户端查看该加密表数据时是密文。
openGauss=# select id_number,name from creditcard_info; 
     id_number |                name 
     -----------+------------------------------------------- 
     1 | \x011aefabd754ded0a536a96664790622487c4d36 
     2 | \x011aefabd76853108eb406c0f90e7c773b71648f 
     (2 rows)
  • JDBC环境下向加密表插入数据并查看:
// 插入数据
     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();

上述我们列出的是全密态数据库特性的基本使用方法,更全面的使用介绍,可以参考官方文档中的对应章节。

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容