使用全密态数据库集群时,不同用户之间天然存在密文数据隔离,可以通过签发BCL(Behavior Control List)授权,实现不同用户之间的数据融合计算。
前提条件
背景信息
全密态数据库中,用户数据使用各自的数据密钥进行加密,不同用户之间的密文数据天然存在隔离。若需要使用多方用户的数据进行联合查询,可以通过签发BCL授权的方式,授权联合查询的指定参与方,在不泄露数据的前提下查询其他参与方的数据。
场景示例:
某数据平台收集了用户画像数据(例如不同年龄分布),对表中的敏感数据列使用数据平台独享的数据密钥进行了加密,并存储于后端PolarDB全密态数据库中。数据密钥只有数据平台持有,因此在非授权状态下,任意第三方仅可见密文数据,且无法直接使用用户画像数据。
某广告业务应用,希望使用数据平台的用户画像数据辅助进行人群圈选,从而对特定目标用户人群(例如年龄小于30岁)定向推送广告。此时,广告业务应用可以向数据平台发起用户画像数据使用授权申请(调用相应的授权申请接口,并在BCL中指明授权申请信息),若数据平台审批后同意授权,则签发该BCL授权申请。广告业务应用获得授权后,可以在查询中使用用户画像数据,并获得查询目标用户人群信息,进而向目标用户人群定向推送广告。
在该业务场景中,广告业务应用即便获得数据平台授权,也只能在BCL指明的授权范围内使用用户画像数据,且仅能获得最终查询结果,无法获得任意中间数据。
操作步骤
在参与方的业务代码中,参考如下命令,初始化各自的证书公钥。
//参与方用户证书私钥 String userPriPemString = "*****"; //参与方用户证书公钥 String userPukPemString = "*****"; //初始化,只需要初始化执行一次,无需重复执行 KeyManager km = sdk.getKeyManager(); km.registerCertificate(userPriPemString, userPukPemString);
定义授权内容。
String bclBodyJsonString = """{ "version": 1, "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8", "issuer_pukid": "dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo=", "subject_pukid": "+Gg4vXehPt9BWlCPdR83wKDn6E1b/XddNhKQ5mVbKVQ=", "validity": { "not_after": "20220820111111+0800", "not_before": "20230820111111+0800" }, "policies": { "issuer_dek_group": [ { "min": 1, "max": 100000, "groupid": "b6785611-0c49-4f13-87a9-13f151de9b4d" } ], "result_dek": "SUBJECT", "subject_dek_group": [ { "min": 1, "max": 100000, "groupid": "5e19cfa7-c001-4e44-acab-2e5de4b97dcb" } ], "operation": [ "*" ], "postproc": "NULL", "preproc": "NULL" } }""";
参数说明
参数
取值样例
说明
version
1
版本号,当前固定为1。
serial_num
"a121bac0-5cb3-4463-a2b2-1155ff29f4c8"
序列号,UUID格式,自定义,全局唯一。
issuer_pukid
"dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo="
授权方证书摘要。
获取方法:
将证书内容进行Hash加密。
说明Hash加密算法默认
SHA 256
,您可以指定其他加密算法。证书内容即以下示例内容,包括-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----。
-----BEGIN CERTIFICATE----- dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo= -----END CERTIFICATE-----
将加密所得的Hash值进行Base64编码。
将Base64编码所得的字符串配置到此参数。
subject_pukid
"+Gg4vXehPt9BWlCPdR83wKDn6E1b/XddNhKQ5mVbKVQ="
申请方用户证书摘要,配置方法与issuer_pukid相同。
validity
{ "not_before": "20220820111111+0800", "not_after": "20230820111111+0800"}
授权有效期。需使用GeneralizedTime时间格式。
"not_before":有效期开始时间。
"not_after":有效期结束时间。
policies
issuer_dek_group
[ { "min": 1, "max": 100000, "groupid": "b6785611-0c49-4f13-87a9-13f151de9b4d" }]
授权方允许使用的数据密钥(DEK)分组。
"groupid":DEK分组ID。
"min":分组内授权的最小DEK ID。
"max":分组内授权的最大DEK ID。
说明可通过SELECT encdb_get_cc_entry_by_name(<keyname>);获取groupid和dekid。 keyname配置为目标被授权访问的列。
subject_dek_group
[ { "min": 1, "max": 100000, "groupid": "5e19cfa7-c001-4e44-acab-2e5de4b97dcb" }]
申请方允许使用的数据密钥(DEK)分组。
"groupid":DEK分组ID。
"min":分组内授权的最小DEK ID。
"max":分组内授权的最大DEK ID。
说明可通过SELECT encdb_get_cc_entry_by_name(<keyname>);获取groupid和dekid。keyname配置为目标被授权访问的列。
result_dek
"SUBJECT"
计算结果使用的DEK加密方式。
"SUBJECT":使用当前计算中申请方的DEK加密。
"ISSUER":使用当前计算中授权方的DEK加密。
DEK ID:使用指定DEK ID的DEK加密。
重要如果使用
DEK ID
,直接在此参数配置DEK ID的内容,无需添加双引号。
operation
[ "*"]
允许的计算操作。
"encrypt":加密。
"decrypt":解密。
"cmp":比较。
说明如果配置为
"*"
,则表示全授权。postproc
"NULL"
计算前需要的前置预处理操作。当前固定为NULL,表示无前置预处理操作。
preproc
"NULL"
计算后需要的后置预处理操作。当前固定为NULL,表示无后置预处理操作。
申请方发起BCL授权申请。
boolean isIssuer = false; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPriPemString, isIssuer);
授权方签发BCL同意授权。
boolean isIssuer = true; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPriPemString, isIssuer);
(可选)如果授权方需要撤销授权,则使用如下配置。
定义撤销授权内容。
brlBodyJsonString = """{ "version": 1, "pukid": "dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo=", "this_update": "20220819111128+0800", "next_update": "20220919111128+0800", "revoked": [ { "revocation_date": "20220819111128+0800", "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8" } ] }""";
参数说明
参数
取值样例
说明
version
1
版本号,当前固定为1。
pukid
"dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo="
授权方证书摘要。需配置为请求授权时BCL中的授权方证书摘要。
this_update
"20220819111128+0800"
本次撤销列表更新时间,需使用GeneralizedTime时间格式。
next_update
"20220919111128+0800"
下次撤销列表更新时间,需使用GeneralizedTime时间格式。
revoked
revocation_date
"20220819111128+0800"
撤销时间,需使用GeneralizedTime时间格式。
serial_num
"a121bac0-5cb3-4463-a2b2-1155ff29f4c8"
序列号,UUID格式,需配置为请求授权时BCL中的序列号。
授权方签发BCL撤销授权。
brlBodyJsonString = km.revokeBCL(brlBodyJsonString, userPukPemString, userPriPemString);