介绍
密态数据库将解决数据整个生命周期中的隐私保护问题,涵盖网络传输、数据存储以及数据运行态;更进一步,密态数据库可以实现云化场景下的数据隐私权限分离,即实现数据拥有者和实际数据管理者的数据读取能力分离。密态等值查询将优先解决密文数据的等值类查询问题。密态等值查询目前支持客户端工具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 -CPassword 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 KEYbicewow@192.168.20.253 [db1]=># 创建后,出现如下文件[omm@dmdem zskey]$ lltotal 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 -CPassword 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 KEYbicewow@192.168.20.253 [db1]=>[omm@dmdem zskey]$ lltotal 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 TABLEbicewow@192.168.20.253 [db1]=>\dList of relationsSchema | Name | Type | Owner | Storage--------+-------------+-------+---------+----------------------------------public | zscard_info | table | bicewow | {orientation=row,compression=no}(1 row)bicewow@192.168.20.253 [db1]=>\d+ zscard_infoTable "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: noOptions: orientation=row, compression=no
向加密表插入数据
bicewow@192.168.20.253 [db1]=>INSERT INTO zscard_info VALUES (1,'zs','41133322091002933');INSERT 0 1bicewow@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]$ lltotal 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 -CPassword 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 | 411333220910029332 | 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 -CPassword 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 -CPassword 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 keybicewow@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 bicewowPassword 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 | \x01e4abdfe9e8ae6808582b6553285192abcd6717c69692e020b29f717d84c9caacd800365b310000000c3e94db184e56b07af690d4ef545007bb7d8c2d768daf2ceacfd56f67970e93ef4b02aa0e0797fc3146009b26d2b11e2 | \x01e4abdfe93af5a2206a8ce8758a6db13e804e18818846bdf835ca9a8b772a96be9864dc9831000000448c0d247d103ab2d35d813e3d9aaccf32f58c088e199f1eba8a2be28b2aad17 | \x01e4abdfe9ee220c7e626d1f571b780c1d73d54ee70374caed848c371555c2eb8df91ecced31000000df86b1591487e1daeb298a21cbc37e1e1c65f1be2c3c3cc61aa86f012fc8e93d10b0fc8a2ef30982737f756f71bf4b62(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 bicewowPassword 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 | \x01e4abdfe9e8ae6808582b6553285192abcd6717c69692e020b29f717d84c9caacd800365b310000000c3e94db184e56b07af690d4ef545007bb7d8c2d768daf2ceacfd56f67970e93ef4b02aa0e0797fc3146009b26d2b11e2 | \x01e4abdfe93af5a2206a8ce8758a6db13e804e18818846bdf835ca9a8b772a96be9864dc9831000000448c0d247d103ab2d35d813e3d9aaccf32f58c088e199f1eba8a2be28b2aad17 | \x01e4abdfe9ee220c7e626d1f571b780c1d73d54ee70374caed848c371555c2eb8df91ecced31000000df86b1591487e1daeb298a21cbc37e1e1c65f1be2c3c3cc61aa86f012fc8e93d10b0fc8a2ef30982737f756f71bf4b62(2 rows)
总结
通过配置密态等值相关设置,可以实现对数据根源加密,没有相关密钥信息,即使数据被拖库也不用太多担心,得到全是加密数据,那么问题来了,密钥丢失怎么办?




