授权多用户访问

使用全密态数据库集群时,不同用户之间天然存在密文数据隔离,可以通过签发BCL(Behavior Control List)授权,实现不同用户之间的数据融合计算。

前提条件

背景信息

全密态数据库中,用户数据使用各自的数据密钥进行加密,不同用户之间的密文数据天然存在隔离。若需要使用多方用户的数据进行联合查询,可以通过签发BCL授权的方式,授权联合查询的指定参与方,在不泄露数据的前提下查询其他参与方的数据。

场景示例:

某数据平台收集了用户画像数据(例如不同年龄分布),对表中的敏感数据列使用数据平台独享的数据密钥进行了加密,并存储于后端PolarDB全密态数据库中。数据密钥只有数据平台持有,因此在非授权状态下,任意第三方仅可见密文数据,且无法直接使用用户画像数据。

某广告业务应用,希望使用数据平台的用户画像数据辅助进行人群圈选,从而对特定目标用户人群(例如年龄小于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,您可以指定其他加密算法。

      • 证书内容即以下示例内容,包括-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----。

        -----BEGIN CERTIFICATE-----
        dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo=
        -----END CERTIFICATE-----
    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);