全部產品
Search
文件中心

ApsaraDB RDS:授權多使用者訪問

更新時間:Aug 27, 2024

使用全密態資料庫執行個體時,不同使用者之間天然存在密文資料隔離,可以通過簽發BCL(Behavior Control List)授權,實現不同使用者之間資料融合計算。

前提條件

背景資訊

全密態資料庫中,使用者資料使用各自的資料密鑰進行加密,不同使用者之間的密文資料天然存在隔離。若需要使用多方使用者的資料進行聯集查詢,可以通過簽發BCL授權的方式,授權聯集查詢的指定參與方,在不泄露資料的前提下查詢其他參與方的資料。

情境樣本:

某資料平台收集了使用者畫像資料(例如不同年齡分布),對錶中的敏感性資料列使用資料平台獨享的資料密鑰進行了加密,並儲存於後端RDS全密態資料庫中。資料密鑰只有資料平台持有,因此在非授權狀態下,任意第三方僅可見密文資料,且無法直接使用使用者畫像資料。

某廣告業務應用,希望使用資料平台的使用者畫像資料輔助進行人群圈選,從而對特定目標使用者人群(例如年齡小於30歲)定向推送廣告。此時,廣告業務應用可以向資料平台發起使用者畫像資料使用授權申請(調用相應的授權申請介面,並在BCL中指明授權申請資訊),若資料平台審批後同意授權,則簽發該BCL授權申請。廣告業務應用獲得授權後,可以在查詢中使用使用者畫像資料,並獲得查詢目標使用者人群資訊,進而向目標使用者人群定向推送廣告。

在該業務情境中,廣告業務應用即便獲得資料平台授權,也只能在BCL指明的授權範圍內使用使用者畫像資料,且僅能拿到最終查詢結果,無法獲得任意中間資料。

操作步驟

  1. 在參與方的業務代碼中,參考如下命令,初始化各自的認證公開金鑰。

    //參與方使用者認證私密金鑰
    String userPriPemString = "*****";
    //參與方使用者認證公開金鑰
    String userPukPemString = "*****";
    //初始化,只需要初始化執行一次,無需重複執行
    KeyManager km = sdk.getKeyManager();
    km.registerCertificate(userPriPemString, userPukPemString);
  2. 定義授權內容。

    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="

    授權方認證摘要。

    擷取方法:

    1. 認證內容 進行Hash加密。

      說明

      Hash密碼編譯演算法預設SHA 256,您可以指定其他密碼編譯演算法。

    2. 將加密所得的Hash值進行Base64編碼。

    3. 將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>);擷取groupiddekidkeyname配置為目標被授權訪問的列。

    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>);擷取groupiddekidkeyname配置為目標被授權訪問的列。

    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,表示無後置預先處理操作。

  3. 申請方發起BCL授權申請。

    boolean isIssuer = false;
    bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPriPemString, isIssuer);
  4. 授權方簽發BCL同意授權。

    boolean isIssuer = true;
    bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPriPemString, isIssuer);
  5. (可選)如果授權方需要撤銷授權,則使用如下配置。

    1. 定義撤銷授權內容。

      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中的序號。

    2. 授權方簽發BCL撤銷授權。

      brlBodyJsonString = km.revokeBCL(brlBodyJsonString, userPukPemString, userPriPemString);