原文链接:https://www.gbase.cn/community/post/4151
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
南大通用GBase 8c数据库具有全密态数据库特性,用以解决数据库服务端数据生命周期的隐私保护,使得数据在传输、计算、存储等各个环节中始终处于密文状态。全密态数据库特性能够保护数据全生命周期的隐私安全,无论处于何种状态,攻击者都无法获取有效信息。适用于金融、医疗、政务等对数据敏感的应用场景。全密态数据库目前支持两种连接方式:默认gsql客户端连接和jdbc远程连接。全密态数据库有两种密钥,即客户端主密钥CMK和数据加密密钥CEK。创建CEK依赖于CMK,即创建CMK之后才能创建CEK。
实现流程为:
- 在客户端识别密钥之后对数据进行加密,并存储到数据库中;
- 在创建了客户端主密钥CMK和数据加密密钥CEK之后,就可以使用CEK创建加密表;
- 插入数据;
- 在读取数据时使用密钥进行解密,从而确保即使数据被攻击也无法直接读取数据内容。
下文将对南大通用GBase 8c全密态数据库的密钥做简要说明。
(1)客户端主密钥
语法格式
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
该参数用于指定加密算法的类型。创建数据加密密钥CEK时受此参数影响,使用该参数指定的加密算法进行加密。取值范围:RSA_2048、RSA_3072和SM2。
注意事项
gsql客户端连接数据库服务器时,需使用‘-C’参数,打开开关即可使用本语法。
密钥存储路径:默认情况下,localkms将在$LOCALKMS_FILE_PATH路径下生成/读取/删除密钥文件,用户可手动配置该环境变量。但是,用户也可以不用单独配置该环境变量,在尝试获取$LOCALKMS_FILE_PATH失败时,localkms会尝试获取$GAUSSHOME/etc/localkms/路径,如果该路径存在,则将其作为密钥存储路径。 密钥相关文件名:使用CREATE CMK语法时,localkms将会创建四个与存储密钥相关的文件。
(2)数据加密密钥
语法格式
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比特的密钥。
说明: 由于SM2、SM3、SM4等算法属于中国国家密码标准算法,为规避法律风险,需配套使用。如果创建CMK时指定SM4算法来加密CEK,则创建CEK时必须指定SM4_SM3算法来加密数据。
(3)全密态密钥CMK和CEK使用示例
--在服务端创建路径
[gbase@gbase ~]$ mkdir -p $GAUSSHOME/etc/localkms/
--配置环境变量
[gbase@gbase ~]$ vim ~/.bashrc
----添加一行:
export LOCALKMS_FILE_PATH=$GAUSSHOME/etc/localkms/
----“:wq”保存并退出
--配置环境变量生效
[gbase@gbase ~]$ source ~/.bashrc
以全密态模式登录数据库:
[gbase@gbase ~]$ gsql -d postgres -p 15400 -C
在数据库中:
--创建客户端秘钥
CREATE CLIENT MASTER KEY another_cmk WITH (KEY_STORE = localkms, KEY_PATH = "another_path_value", ALGORITHM = SM2);
--创建列加密秘钥
CREATE COLUMN ENCRYPTION KEY another_cek WITH VALUES (CLIENT_MASTER_KEY = another_cmk, ALGORITHM = SM4_SM3);
--创建加密表
CREATE TABLE creditcard_info (id_number int, name text encrypted with (column_encryption_key = another_cek, encryption_type = DETERMINISTIC),
credit_card varchar(19) encrypted with (column_encryption_key = another_cek, encryption_type = DETERMINISTIC));
--插入数据
INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');
INSERT INTO creditcard_info VALUES (2, 'joy','6219985678349800033');
--查询数据(普通模式(不指定-C)和全密态模式(指定-C)下分别执行)
select * from creditcard_info;
在全密态模式下,直接查询返回插入数据:
在普通模式下,执行查询显示加密数据:
(4)字段加解密
除上述语法之外,南大通用GBase 8c数据库还支持系统函数用于对字段进行加解密操作,说明如下:
- gs_encrypt_aes128(encryptstr,keystr)
描述:以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为8~16字节,至少包含3种字符(大写字母、小写字母、数字、特殊字符)。
返回值类型:text
返回值长度:至少为92字节,不超过4*[(Len+68)/3]字节,其中Len为加密前数据长度(单位为字节)。
示例:
postgres=# SELECT gs_encrypt_aes128('张三','Asdf1234');
gs_encrypt_aes128
----------------------------------------------------------------------------------------------
yDFbNa2auMXyIyh0fmh7/8GFDyKwEsyzXUzMWhX0feY6MH4LxHq4VYmfMNEtAHLB2KFmAn1/9Eo1Oxa3dnATOySSNbU=
(1 row)
- gs_decrypt_aes128(decryptstr,keystr)
描述:以keystr为密钥对decrypt字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。
返回值类型:text
示例:
postgres=# SELECT gs_decrypt_aes128('yDFbNa2auMXyIyh0fmh7/8GFDyKwEsyzXUzMWhX0feY6MH4LxHq4VYmfMNEtAHLB2KFmAn1/9Eo1Oxa3dnATOySSNbU=','Asdf1234');
gs_decrypt_aes128
-------------------
张三
(1 row)
原文链接:https://www.gbase.cn/community/post/4151
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。