多方數(shù)據(jù)融合計(jì)算
全密態(tài)數(shù)據(jù)庫可以用于多方數(shù)據(jù)融合計(jì)算,支持?jǐn)?shù)據(jù)所有者授權(quán)第三方使用數(shù)據(jù)參與計(jì)算,實(shí)現(xiàn)聯(lián)合營銷等多種場景。
場景介紹
以某數(shù)據(jù)平臺(tái)公司業(yè)務(wù)場景為例,該平臺(tái)通過合法渠道,經(jīng)用戶授權(quán)后,收集了用戶信息,生成用戶畫像表(portrait),可以授權(quán)第三方(例如保險(xiǎn)公司)使用數(shù)據(jù)進(jìn)行多方數(shù)據(jù)融合計(jì)算,實(shí)現(xiàn)聯(lián)合營銷。
手機(jī)號(hào)(phone) | 年齡(age) | 是否有車(have_car) | 年消費(fèi)金額(annual_consume) |
13900001111 | 29 | N | 20000 |
13900002222 | 34 | Y | 10000 |
上表中數(shù)據(jù)僅為示例。
保險(xiǎn)公司希望借助數(shù)據(jù)平臺(tái)公司的數(shù)據(jù),幫助保險(xiǎn)公司發(fā)展?jié)撛谟脩?,例如向有車一族定向推送車輛保險(xiǎn)。
聯(lián)合查詢應(yīng)滿足:
未授權(quán)時(shí),聯(lián)合查詢SQL失敗,提示無權(quán)限。
簽發(fā)BCL查詢授權(quán),聯(lián)合查詢SQL成功,并返回密文結(jié)果。
簽發(fā)BCL解密授權(quán),授權(quán)結(jié)果方可以解密得到明文結(jié)果。
多方數(shù)據(jù)融合計(jì)算流程示例
本文以個(gè)人隱私保護(hù)中的保險(xiǎn)公司為例進(jìn)行舉例,請(qǐng)先參見個(gè)人隱私保護(hù)完成相關(guān)配置。
數(shù)據(jù)平臺(tái)公司
DBA創(chuàng)建用戶和數(shù)據(jù)庫表。
-------- 創(chuàng)建用戶 -------- -- 數(shù)據(jù)平臺(tái)公司 CREATE USER ly; -- 為數(shù)據(jù)平臺(tái)公司創(chuàng)建用戶畫像表 CREATE TABLE portrait ( phone enc_text, age enc_int4, have_car enc_text, annual_consume enc_int8 ); -- 授權(quán)數(shù)據(jù)平臺(tái)公司訪問數(shù)據(jù)表 GRANT ALL ON portrait TO ly;
注冊(cè)數(shù)據(jù)平臺(tái)公司賬號(hào)。
說明EncDB Tool工具將會(huì)基于傳入的參數(shù)自動(dòng)生成SQL語句,您需要將生成的SQL在數(shù)據(jù)庫中執(zhí)行。
./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_ly.bin -e default_enclave_public_key.pem -c ${cipher_suite} # 獲取數(shù)據(jù)平臺(tái)公司MEKID,可以通過SQL查詢獲得:SELECT encdb_get_current_mek_id(); # 本文以6953973016013340672為例 mekid_ly = 6953973016013340672 ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_ly} --mek sample/default_mek_ly.bin --puk sample/usr_puk_ly.pem --pri sample/usr_pri_ly.pem -c ${cipher_suite}
平臺(tái)公司為用戶畫像表創(chuàng)建加密密鑰。
說明如下命令需使用
ly
用戶執(zhí)行。命令中的
encdb.dek_xxx()
和encdb.keyname_xxx()
為類型轉(zhuǎn)換函數(shù),更多用法,請(qǐng)參見類型轉(zhuǎn)換函數(shù)說明。
-- 創(chuàng)建一個(gè)dek,記錄groupid,例如 fd89d386-ee00-4e0e-9e5f-66efb4c124aa SELECT encdb.dek_generate(encdb.keyname_generate('ly','demo','public','portrait','phone')); -- 此處僅為示例,同步給所有列,即共用一個(gè)dek SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ly','demo','public','portrait','age'),encdb.keyname_generate('ly','demo','public','portrait','phone')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ly','demo','public','portrait','have_car'),encdb.keyname_generate('ly','demo','public','portrait','phone')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ly','demo','public','portrait','annual_consume'),encdb.keyname_generate('ly','demo','public','portrait','phone'));
正常情況下,不允許用戶直接通過SQL加密數(shù)據(jù)(不安全),用戶需要明確授權(quán)該行為。
編輯BCL內(nèi)容,將目標(biāo)dek的授權(quán)范圍(包括groupid)更新到BCL中。
./setGroupIdBCL.sh -l fd89d386-ee00-4e0e-9e5f-66efb4c124aa
說明本示例中的
fd89d386-ee00-4e0e-9e5f-66efb4c124aa
僅為示例,實(shí)際取值請(qǐng)從如下命令中獲取:SELECT encdb.dek_generate(encdb.keyname_generate('ly','demo','public','portrait','phone'));
簽發(fā)BCL。
./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_ly.pem --spuk sample/usr_puk_ly.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_for_ly_insert.txt -c ${cipher_suite} ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_ly.pem --spuk sample/usr_puk_ly.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_for_ly_insert.txt -c ${cipher_suite}
數(shù)據(jù)平臺(tái)公司寫入數(shù)據(jù)。
說明如下命令需使用
ly
用戶執(zhí)行。INSERT INTO portrait VALUES(encdb.enc_text_encrypt('13900001111',encdb.keyname_generate('ly','demo','public','portrait','phone')), encdb.enc_int4_encrypt('29',encdb.keyname_generate('ly','demo','public','portrait','age')), encdb.enc_text_encrypt('N',encdb.keyname_generate('ly','demo','public','portrait','have_car')), encdb.enc_int8_encrypt('2',encdb.keyname_generate('ly','demo','public','portrait','annual_consume'))); INSERT INTO portrait VALUES(encdb.enc_text_encrypt('13900002222',encdb.keyname_generate('ly','demo','public','portrait','phone')), encdb.enc_int4_encrypt('34',encdb.keyname_generate('ly','demo','public','portrait','age')), encdb.enc_text_encrypt('Y',encdb.keyname_generate('ly','demo','public','portrait','have_car')), encdb.enc_int8_encrypt('1',encdb.keyname_generate('ly','demo','public','portrait','annual_consume')));
保險(xiǎn)公司
保險(xiǎn)公司銷售部門為了向有車一族推送車輛保險(xiǎn),發(fā)起聯(lián)合查詢:
SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE hava_car = 'Y';
保險(xiǎn)公司銷售部門授權(quán)encrypt權(quán)限。
編輯BCL內(nèi)容,將目標(biāo)dek的授權(quán)范圍(包括groupid)更新到BCL中。
./setGroupIdBCL.sh -s 7903d109-f3e0-4f3e-b815-3682cb8bd6db
說明本示例中的
7903d109-f3e0-4f3e-b815-3682cb8bd6db
僅為示例,銷售使用默認(rèn)密鑰進(jìn)行加密,對(duì)應(yīng)groupid可以通過如下命令查詢:# 獲取銷售部門賬號(hào)MEKID,以2715553450389700608為例 SELECT encdb_get_current_mek_id(); # 獲取groupid SELECT groupid FROM encdb.encdb_internal_dek_table WHERE mekid = 2715553450389700608;
簽發(fā)BCL。
./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_sale.pem --bcl sample/bcl_for_sale_insert.txt -c ${cipher_suite} ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_sale.pem --bcl sample/bcl_for_sale_insert.txt -c ${cipher_suite}
保險(xiǎn)公司銷售部門查詢數(shù)據(jù)。
銷售部門未得到數(shù)據(jù)平臺(tái)公司授權(quán),使用數(shù)據(jù)平臺(tái)公司數(shù)據(jù):
說明如下命令需使用
ins_sale
用戶執(zhí)行。SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE pt.have_car = encdb.enc_text_encrypt('Y',encdb.keyname_generate('ins_sale','demo', Null, Null, Null)); WARNING: -- encdb -- -- Untrusted log -- 4 - src/core/untrusted/src/encdb_untrusted_enclave.cpp,256,encdb_ecall: Select BCL (subject_mekid: 2715553450389700608, issuer_mekid: 6953973016013340672) from table fail - returned 0xfa030000 ERROR: pg_enc_cmp_eq: encrypted type equal errno: fa030000
說明如果出現(xiàn)
ERROR: permission denied for table portrait
的錯(cuò)誤時(shí),執(zhí)行GRANT SELECT ON portrait TO ins_sale;
授權(quán)訪問表。銷售部門獲得數(shù)據(jù)平臺(tái)公司及數(shù)據(jù)部門授權(quán)后,使用數(shù)據(jù)平臺(tái)公司數(shù)據(jù)。
銷售部門向平臺(tái)公司發(fā)起授權(quán),平臺(tái)公司審批后,簽發(fā)授權(quán)。
# 銷售部門發(fā)起授權(quán)請(qǐng)求:SUBJECT申請(qǐng)方簽名確認(rèn) ./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_ly_for_sale_select.txt -c ${cipher_suite} # 平臺(tái)公司審批后確認(rèn)授權(quán)、并簽發(fā)BCL:ISSUER授權(quán)方簽名確認(rèn) ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_ly.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_ly_for_sale_select.txt -c ${cipher_suite}
銷售部門向數(shù)據(jù)部門發(fā)起授權(quán),數(shù)據(jù)部門審批后,簽發(fā)授權(quán)。
# 銷售部門發(fā)起授權(quán)請(qǐng)求:SUBJECT申請(qǐng)方簽名確認(rèn) ./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_data_for_sale_select.txt -c ${cipher_suite} # 數(shù)據(jù)部門審批后確認(rèn)授權(quán)、并簽發(fā)BCL:ISSUER授權(quán)方簽名確認(rèn) ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_data.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_data_for_sale_select.txt -c ${cipher_suite}
銷售部門可以正確執(zhí)行聯(lián)合查詢拿到密文計(jì)算結(jié)果。
說明如下命令需使用
ins_sale
用戶執(zhí)行。SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE pt.have_car = encdb.enc_text_encrypt('Y',encdb.keyname_generate('ins_sale','demo', Null, Null, Null)); -- 可以查詢得到聯(lián)合查詢密文結(jié)果