全部產品
Search
文件中心

ApsaraDB RDS:多方資料融合計算

更新時間:Jun 19, 2024

全密態資料庫可以用於多方資料融合計算,支援資料所有者授權第三方使用資料參與計算,實現聯合營銷等多種情境。

情境介紹

以某資料平台公司業務情境為例,該平台通過合法渠道,經使用者授權後,收集了使用者資訊,產生使用者畫像表(portrait),可以授權第三方(例如保險公司)使用資料進行多方資料融合計算,實現聯合營銷。

手機號(phone)

年齡(age)

是否有車(have_car)

年消費金額(annual_consume)

13900001111

29

N

20000

13900002222

34

Y

10000

說明

上表中資料僅為樣本。

保險公司希望藉助資料平台公司的資料,協助保險公司發展潛在使用者,例如向有車一族定向推送車輛保險。

聯集查詢應滿足:

  • 未授權時,聯集查詢SQL失敗,提示無許可權。

  • 簽發BCL查詢授權,聯集查詢SQL成功,並返回密文結果。

  • 簽發BCL解密授權,授權結果方可以解密得到明文結果。

前提條件

本文以個人隱私保護中的保險公司為例進行舉例,請先參見個人隱私保護完成相關配置。

多方資料融合計算流程樣本

資料平台公司

  1. 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;
  2. 註冊資料平台公司帳號。

    說明

    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}
  3. 平台公司為使用者畫像表建立加密金鑰。

    說明
    • 如下命令需使用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加密資料(不安全),使用者需要明確授權該行為。

    1. 編輯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'));
    2. 簽發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}
  4. 資料平台公司寫入資料。

    說明

    如下命令需使用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';
  1. 保險公司銷售部門授權encrypt許可權。

    1. 編輯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;
    2. 簽發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}
  2. 保險公司銷售部門查詢資料。

    • 銷售部門未得到資料平台公司授權,使用資料平台公司資料:

      說明

      如下命令需使用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;授權訪問表。

    • 銷售部門獲得資料平台公司及資料部門授權後,使用資料平台公司資料。

      1. 銷售部門向平台公司發起授權,平台公司審批後,簽發授權。

        # 銷售部門發起授權請求: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}
      2. 銷售部門向資料部門發起授權,資料部門審批後,簽發授權。

        # 銷售部門發起授權請求: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}
      3. 銷售部門可以正確執行聯集查詢拿到密文計算結果。

        說明

        如下命令需使用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));
        -- 可以查詢得到聯集查詢密文結果