使用Intel SGX 安全增强型规格的数据库实例时,不同用户之间天然存在密文数据隔离,可以通过签发BCL(Behavior Control List)授权,实现不同用户之间数据融合计算。

前提条件

  • 已创建Intel SGX 安全增强型的RDS PostgreSQL实例,并完成全加密数据库的相关配置。具体请参见配置步骤(安全增强型实例)
  • RDS PostgreSQL实例的内核小版本大于等于20220830,如需升级内核小版本,请参见升级内核小版本
  • 已获得 参与方 的证书及证书私钥。

背景信息

全加密数据库中,用户数据使用各自的数据密钥进行加密,不同用户之间的密文数据天然存在隔离。若需要使用多方用户的数据进行联合查询,可以通过签发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);