暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

openGauss 6.0 密态等值查询实现数据保护

364

介绍

密态数据库将解决数据整个生命周期中的隐私保护问题,涵盖网络传输、数据存储以及数据运行态;更进一步,密态数据库可以实现云化场景下的数据隐私权限分离,即实现数据拥有者和实际数据管理者的数据读取能力分离。密态等值查询将优先解决密文数据的等值类查询问题。密态等值查询目前支持客户端工具gsql和JDBC。

实现步骤如下:
1、使用gsql工具生成2个类型本地的key文件
2、创建表,在需要加密列使用列key
3、表插入数据,利用key对数据加密(数据库自动加密,此时数据库已经为加密数据)
4、查询数据,利用key查询明文(无key查询密文)

下面演示一下具体实践步骤。

实践步骤

创建密钥

密钥有两种,客户端主密钥对象和列加密密钥对象,客户端主密钥可用于加密列加密密钥对象;列加密密钥,用于加密表中指定列。
下面创建一起创建两种密钥。

客户端主密钥

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

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

# 创建客户端主密钥,没有加-C
[omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home/omm/zskey
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow  <======没有加-C,创建失败
....
bicewow@192.168.20.253 [db1]=>CREATE CLIENT MASTER KEY ZsCMK1 WITH (KEY_STORE = localkms, KEY_PATH = "zskey1", ALGORITHM = RSA_2048);
ERROR(CLIENT): disable client-encryption feature, please use -C to enable it.
bicewow@192.168.20.253 [db1]=>\q

# 创建客户端主密钥,加-C
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>CREATE CLIENT MASTER KEY ZsCMK1 WITH (KEY_STORE = localkms, KEY_PATH = "zskey1", ALGORITHM = RSA_2048);
CREATE CLIENT MASTER KEY
bicewow@192.168.20.253 [db1]=>
# 创建后,出现如下文件
[omm@dmdem zskey]$ ll
total 16
-rw------- 1 omm dbgrp 1752 Oct 31 14:38 zskey1.priv
-rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.priv.rand
-rw------- 1 omm dbgrp  536 Oct 31 14:38 zskey1.pub
-rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.pub.rand

语法格式

语法格式
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、RSA_3072和SM2。

密钥说明

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

列加密密钥

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

由该语法创建CEK对象可用于列级加密。在定义表中列字段时,可指定一个CEK对象,用于加密该列。

[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>CREATE COLUMN ENCRYPTION KEY ZsCEK1 WITH VALUES (CLIENT_MASTER_KEY = ZsCMK1, ALGORITHM  = AEAD_AES_256_CBC_HMAC_SHA256);
CREATE COLUMN ENCRYPTION KEY
bicewow@192.168.20.253 [db1]=>
[omm@dmdem zskey]$ ll
total 16
-rw------- 1 omm dbgrp 1752 Oct 31 14:38 zskey1.priv
-rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.priv.rand
-rw------- 1 omm dbgrp  536 Oct 31 14:38 zskey1.pub
-rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.pub.rand

参数说明

  • 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字符的密钥。

密钥信息查询

bicewow@192.168.20.253 [db1]=>SELECT * FROM gs_client_global_keys;
 global_key_name | key_namespace | key_owner | key_acl |        create_date         
-----------------+---------------+-----------+---------+----------------------------
 zscmk1          |          2200 |     16389 |         | 2024-10-31 14:38:14.631795
(1 row)

bicewow@192.168.20.253 [db1]=>SELECT column_key_name,column_key_distributed_id ,global_key_id,key_owner  FROM gs_column_keys;
 column_key_name | column_key_distributed_id | global_key_id | key_owner 
-----------------+---------------------------+---------------+-----------
 zscek1          |                3923749860 |         16393 |     16389
(1 row)

创建加密表


bicewow@192.168.20.253 [db1]=>CREATE TABLE zscard_info (id_number int, name  text encrypted with (column_encryption_key = zscek1, encryption_type = DETERMINISTIC),credit_card  varchar(19) encrypted with (column_encryption_key = zscek1, encryption_type = DETERMINISTIC));
CREATE TABLE
bicewow@192.168.20.253 [db1]=>\d
                             List of relations
 Schema |    Name     | Type  |  Owner  |             Storage              
--------+-------------+-------+---------+----------------------------------
 public | zscard_info | table | bicewow | {orientation=row,compression=no}
(1 row)

bicewow@192.168.20.253 [db1]=>\d+ zscard_info
                              Table "public.zscard_info"
   Column    |       Type        | Modifiers  | Storage  | Stats target | Description 
-------------+-------------------+------------+----------+--------------+-------------
 id_number   | integer           |            | plain    |              | 
 name        | text              |  encrypted | extended |              |   <======已显示为加密列
 credit_card | character varying |  encrypted | extended |              |   <======已显示为加密列 
Has OIDs: no
Options: orientation=row, compression=no

向加密表插入数据

bicewow@192.168.20.253 [db1]=>INSERT INTO zscard_info VALUES (1,'zs','41133322091002933');
INSERT 0 1
bicewow@192.168.20.253 [db1]=>INSERT INTO zscard_info VALUES (2, 'ls','41122222091005555');
INSERT 0 1

在密态客户端下查询

在具有密钥以及设置环境变量LOCALKMS_FILE_PATH的gsql工具中,如愿查到相关明文数据。

[omm@dmdem zskey]$ pwd
/home/omm/zskey
[omm@dmdem zskey]$ ll
total 16
-rw------- 1 omm dbgrp 1752 Oct 31 14:38 zskey1.priv
-rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.priv.rand
-rw------- 1 omm dbgrp  536 Oct 31 14:38 zskey1.pub
-rw------- 1 omm dbgrp   84 Oct 31 14:38 zskey1.pub.rand
[omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home/omm/zskey
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
 id_number | name |    credit_card    
-----------+------+-------------------
         1 | zs   | 41133322091002933
         2 | ls   | 41122222091005555
(2 rows)

在非密态客户端下查询

情况一 没有指定LOCALKMS_FILE_PATH变量

在没有指定LOCALKMS_FILE_PATH变量或者指定路径不对的情况下,均不能进行明文查询

[omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
ERROR(CLIENT): failed to decrypt column encryption key

[omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home                     
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow -C
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
ERROR(CLIENT): failed to decrypt column encryption key
bicewow@192.168.20.253 [db1]=>

情况二 没有指定gsql连接参数 -C

在创建密钥和表时,都用到了 -C 参数,特定语法需要,没有此参数,就算有密钥查询也是密文。

[omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=/home/omm/zskey           
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
 id_number |                                                                         name                                                                         |                                    
                                                 credit_card                                                                                      
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------
         1 | \x01e4abdfe94d7f55dc82b44f0782461296f4c257a86a38bf62f3fd9e57e211d98eefd711ff310000000f9414f1356cc6427e3ba32d564e8ab97ea14cfeb604f6a45bf6cde1026a6d01 | \x01e4abdfe9e8ae6808582b6553285192a
bcd6717c69692e020b29f717d84c9caacd800365b310000000c3e94db184e56b07af690d4ef545007bb7d8c2d768daf2ceacfd56f67970e93ef4b02aa0e0797fc3146009b26d2b11e
         2 | \x01e4abdfe93af5a2206a8ce8758a6db13e804e18818846bdf835ca9a8b772a96be9864dc9831000000448c0d247d103ab2d35d813e3d9aaccf32f58c088e199f1eba8a2be28b2aad17 | \x01e4abdfe9ee220c7e626d1f571b780c1
d73d54ee70374caed848c371555c2eb8df91ecced31000000df86b1591487e1daeb298a21cbc37e1e1c65f1be2c3c3cc61aa86f012fc8e93d10b0fc8a2ef30982737f756f71bf4b62
(2 rows)

情况二 既没指定key 也没指定连接参数 -C

这种情况查询也是密文。

[omm@dmdem zskey]$ export LOCALKMS_FILE_PATH=
[omm@dmdem zskey]$ gsql -d db1 -p 15400 -h 192.168.20.253 -U bicewow
Password for user bicewow: 
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 18:38:08 commit 0 last mr  )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

bicewow@192.168.20.253 [db1]=>select * from zscard_info ;
 id_number |                                                                         name                                                                         |                                    
                                                 credit_card                                                                                      
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------
         1 | \x01e4abdfe94d7f55dc82b44f0782461296f4c257a86a38bf62f3fd9e57e211d98eefd711ff310000000f9414f1356cc6427e3ba32d564e8ab97ea14cfeb604f6a45bf6cde1026a6d01 | \x01e4abdfe9e8ae6808582b6553285192a
bcd6717c69692e020b29f717d84c9caacd800365b310000000c3e94db184e56b07af690d4ef545007bb7d8c2d768daf2ceacfd56f67970e93ef4b02aa0e0797fc3146009b26d2b11e
         2 | \x01e4abdfe93af5a2206a8ce8758a6db13e804e18818846bdf835ca9a8b772a96be9864dc9831000000448c0d247d103ab2d35d813e3d9aaccf32f58c088e199f1eba8a2be28b2aad17 | \x01e4abdfe9ee220c7e626d1f571b780c1
d73d54ee70374caed848c371555c2eb8df91ecced31000000df86b1591487e1daeb298a21cbc37e1e1c65f1be2c3c3cc61aa86f012fc8e93d10b0fc8a2ef30982737f756f71bf4b62
(2 rows)

总结

通过配置密态等值相关设置,可以实现对数据根源加密,没有相关密钥信息,即使数据被拖库也不用太多担心,得到全是加密数据,那么问题来了,密钥丢失怎么办?

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论