介绍
密态数据库将解决数据整个生命周期中的隐私保护问题,涵盖网络传输、数据存储以及数据运行态;更进一步,密态数据库可以实现云化场景下的数据隐私权限分离,即实现数据拥有者和实际数据管理者的数据读取能力分离。密态等值查询将优先解决密文数据的等值类查询问题。密态等值查询目前支持客户端工具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)
总结
通过配置密态等值相关设置,可以实现对数据根源加密,没有相关密钥信息,即使数据被拖库也不用太多担心,得到全是加密数据,那么问题来了,密钥丢失怎么办?