全密態資料庫可以用於多方資料融合計算,支援資料所有者授權第三方使用資料參與計算,實現聯合營銷等多種情境。
情境介紹
以某資料平台公司業務情境為例,該平台通過合法渠道,經使用者授權後,收集了使用者資訊,產生使用者畫像表(portrait),可以授權第三方(例如保險公司)使用資料進行多方資料融合計算,實現聯合營銷。
手機號(phone) | 年齡(age) | 是否有車(have_car) | 年消費金額(annual_consume) |
13900001111 | 29 | N | 20000 |
13900002222 | 34 | Y | 10000 |
上表中資料僅為樣本。
保險公司希望藉助資料平台公司的資料,協助保險公司發展潛在使用者,例如向有車一族定向推送車輛保險。
聯集查詢應滿足:
未授權時,聯集查詢SQL失敗,提示無許可權。
簽發BCL查詢授權,聯集查詢SQL成功,並返回密文結果。
簽發BCL解密授權,授權結果方可以解密得到明文結果。
前提條件
本文以個人隱私保護中的保險公司為例進行舉例,請先參見個人隱私保護完成相關配置。
多方資料融合計算流程樣本
資料平台公司
DBA建立使用者和資料庫表。
-------- 建立使用者 -------- -- 資料平台公司 CREATE USER ly; -- 為資料平台公司建立使用者畫像表 CREATE TABLE portrait ( phone enc_text, age enc_int4, have_car enc_text, annual_consume enc_int8 ); -- 授權資料平台公司訪問資料表 GRANT ALL ON portrait TO ly;
註冊資料平台公司帳號。
說明EncDB Tool工具將會基於傳入的參數自動產生SQL語句,您需要將產生的SQL在資料庫中執行。
./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_ly.bin -e default_enclave_public_key.pem -c ${cipher_suite} # 擷取資料平台公司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}
平台公司為使用者畫像表建立加密金鑰。
說明如下命令需使用
ly
使用者執行。命令中的
encdb.dek_xxx()
和encdb.keyname_xxx()
為類型轉換函式,更多用法,請參見類型轉換函式說明。
-- 建立一個dek,記錄groupid,例如 fd89d386-ee00-4e0e-9e5f-66efb4c124aa SELECT encdb.dek_generate(encdb.keyname_generate('ly','demo','public','portrait','phone')); -- 此處僅為樣本,同步給所有列,即共用一個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加密資料(不安全),使用者需要明確授權該行為。
編輯BCL內容,將目標dek的授權範圍(包括groupid)更新到BCL中。
./setGroupIdBCL.sh -l fd89d386-ee00-4e0e-9e5f-66efb4c124aa
說明本樣本中的
fd89d386-ee00-4e0e-9e5f-66efb4c124aa
僅為樣本,實際取值請從如下命令中擷取:SELECT encdb.dek_generate(encdb.keyname_generate('ly','demo','public','portrait','phone'));
簽發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}
資料平台公司寫入資料。
說明如下命令需使用
ly
使用者執行。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')));
保險公司
保險公司銷售部門為了向有車一族推送車輛保險,發起聯集查詢:
SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE hava_car = 'Y';
保險公司銷售部門授權encrypt許可權。
編輯BCL內容,將目標dek的授權範圍(包括groupid)更新到BCL中。
./setGroupIdBCL.sh -s 7903d109-f3e0-4f3e-b815-3682cb8bd6db
說明本樣本中的
7903d109-f3e0-4f3e-b815-3682cb8bd6db
僅為樣本,銷售使用預設密鑰進行加密,對應groupid可以通過如下命令查詢:# 擷取銷售部門帳號MEKID,以2715553450389700608為例 SELECT encdb_get_current_mek_id(); # 擷取groupid SELECT groupid FROM encdb.encdb_internal_dek_table WHERE mekid = 2715553450389700608;
簽發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}
保險公司銷售部門查詢資料。
銷售部門未得到資料平台公司授權,使用資料平台公司資料:
說明如下命令需使用
ins_sale
使用者執行。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
說明如果出現
ERROR: permission denied for table portrait
的錯誤時,執行GRANT SELECT ON portrait TO ins_sale;
授權訪問表。銷售部門獲得資料平台公司及資料部門授權後,使用資料平台公司資料。
銷售部門向平台公司發起授權,平台公司審批後,簽發授權。
# 銷售部門發起授權請求:SUBJECT申請方簽名確認 ./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} # 平台公司審批後確認授權、並簽發BCL:ISSUER授權方簽名確認 ./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}
銷售部門向資料部門發起授權,資料部門審批後,簽發授權。
# 銷售部門發起授權請求:SUBJECT申請方簽名確認 ./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} # 資料部門審批後確認授權、並簽發BCL:ISSUER授權方簽名確認 ./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}
銷售部門可以正確執行聯集查詢拿到密文計算結果。
說明如下命令需使用
ins_sale
使用者執行。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)); -- 可以查詢得到聯集查詢密文結果