使用全密態數據庫集群時,不同用戶之間天然存在密文數據隔離,可以通過簽發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);