表形式データの匿名化の例

Cloud Data Loss Prevention(DLP)を使用すると、構造化データ内の機密データの検出、分類、匿名化ができます。コンテンツを表として検査や匿名化を行うことで、ユースケースによっては構造や列が追加の手がかりとなり、より良い結果が得られる場合があります。たとえば、表構造全体ではなく、特定のデータ型の一列をスキャンできます。

このトピックでは、構造化テキスト内の機密データの匿名化を構成する方法の例を示します。匿名化はレコード変換によって可能になります。この変換は、特定の infoType として識別される表形式テキストデータ内の値、または表形式データの列全体に適用されます。

このトピックでは、暗号ハッシュ法を使用した、表形式のデータ変換の例も示します。暗号鍵の要件により、暗号変換方法は一意です。

次の例に示す JSON は、"deidentifyConfig"DeidentifyConfig)属性内のすべての匿名化リクエストに挿入できます。[API Explorer の例] をクリックして、API Explorer でサンプルの JSON を試します。

検査なしで列を変換する

コンテンツがすでにわかっている特定の列を変換する場合、検査をスキップして直接変換を指定できます。下表の例では、「満足度スコア」列を 10 刻みでバケット化します。

入力 変換後の表
年齢 患者 満足度スコア
101 チャールズ ディケンズ 95
22 ジェイン オースティン 21
55 マーク トウェイン 75
年齢 患者 満足度スコア
101 チャールズ ディケンズ 90:100
22 ジェイン オースティン 20:30
55 マーク トウェイン 70:80

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.FieldId;
import com.google.privacy.dlp.v2.FieldTransformation;
import com.google.privacy.dlp.v2.FixedSizeBucketingConfig;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.PrimitiveTransformation;
import com.google.privacy.dlp.v2.RecordTransformations;
import com.google.privacy.dlp.v2.Table;
import com.google.privacy.dlp.v2.Table.Row;
import com.google.privacy.dlp.v2.Value;
import java.io.IOException;

public class DeIdentifyTableBucketing {

  public static void deIdentifyTableBucketing() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    Table tableToDeIdentify = Table.newBuilder()
        .addHeaders(FieldId.newBuilder().setName("AGE").build())
        .addHeaders(FieldId.newBuilder().setName("PATIENT").build())
        .addHeaders(FieldId.newBuilder().setName("HAPPINESS SCORE").build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("101").build())
            .addValues(Value.newBuilder().setStringValue("Charles Dickens").build())
            .addValues(Value.newBuilder().setStringValue("95").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("22").build())
            .addValues(Value.newBuilder().setStringValue("Jane Austen").build())
            .addValues(Value.newBuilder().setStringValue("21").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("55").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain").build())
            .addValues(Value.newBuilder().setStringValue("75").build())
            .build())
        .build();

    deIdentifyTableBucketing(projectId, tableToDeIdentify);
  }

  public static Table deIdentifyTableBucketing(String projectId, Table tableToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify what content you want the service to de-identify.
      ContentItem contentItem = ContentItem.newBuilder().setTable(tableToDeIdentify).build();

      // Specify how the content should be de-identified.
      FixedSizeBucketingConfig fixedSizeBucketingConfig =
          FixedSizeBucketingConfig.newBuilder()
              .setBucketSize(10)
              .setLowerBound(Value.newBuilder().setIntegerValue(0).build())
              .setUpperBound(Value.newBuilder().setIntegerValue(100).build())
              .build();
      PrimitiveTransformation primitiveTransformation =
          PrimitiveTransformation.newBuilder()
              .setFixedSizeBucketingConfig(fixedSizeBucketingConfig)
              .build();

      // Specify field to be encrypted.
      FieldId fieldId = FieldId.newBuilder().setName("HAPPINESS SCORE").build();

      // Associate the encryption with the specified field.
      FieldTransformation fieldTransformation =
          FieldTransformation.newBuilder()
              .setPrimitiveTransformation(primitiveTransformation)
              .addFields(fieldId)
              .build();
      RecordTransformations transformations =
          RecordTransformations.newBuilder().addFieldTransformations(fieldTransformation).build();

      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder().setRecordTransformations(transformations).build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service.
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results.
      System.out.println(
          "Table after de-identification: " + response.getItem().getTable());

      return response.getItem().getTable();
    }
  }
}

API Explorer の例

"deidentifyConfig":{
  "recordTransformations":{
    "fieldTransformations":[
      {
        "fields":[
          {
            "name":"HAPPINESS SCORE"
          }
        ],
        "primitiveTransformation":{
          "fixedSizeBucketingConfig":{
            "bucketSize":10,
            "lowerBound":{
              "integerValue":"0"
            },
            "upperBound":{
              "integerValue":"100"
            }
          }
        }
      }
    ]
  }
}

別の列の値に基づいて列を変換する

別の列の値に基づいて列を変換できます。この例では、89 歳以上のすべての患者の「満足度スコア」を伏せ字にします。

入力 変換後の表
年齢 患者 満足度スコア
101 チャールズ ディケンズ 95
22 ジェイン オースティン 21
55 マーク トウェイン 75
年齢 患者 満足度スコア
101 チャールズ ディケンズ **
22 ジェイン オースティン 21
55 マーク トウェイン 75

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.CharacterMaskConfig;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.FieldId;
import com.google.privacy.dlp.v2.FieldTransformation;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.PrimitiveTransformation;
import com.google.privacy.dlp.v2.RecordCondition;
import com.google.privacy.dlp.v2.RecordCondition.Condition;
import com.google.privacy.dlp.v2.RecordCondition.Conditions;
import com.google.privacy.dlp.v2.RecordCondition.Expressions;
import com.google.privacy.dlp.v2.RecordTransformations;
import com.google.privacy.dlp.v2.RelationalOperator;
import com.google.privacy.dlp.v2.Table;
import com.google.privacy.dlp.v2.Table.Row;
import com.google.privacy.dlp.v2.Value;
import java.io.IOException;

public class DeIdentifyTableConditionMasking {

  public static void deIdentifyTableConditionMasking() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    Table tableToDeIdentify = Table.newBuilder()
        .addHeaders(FieldId.newBuilder().setName("AGE").build())
        .addHeaders(FieldId.newBuilder().setName("PATIENT").build())
        .addHeaders(FieldId.newBuilder().setName("HAPPINESS SCORE").build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("101").build())
            .addValues(Value.newBuilder().setStringValue("Charles Dickens").build())
            .addValues(Value.newBuilder().setStringValue("95").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("22").build())
            .addValues(Value.newBuilder().setStringValue("Jane Austen").build())
            .addValues(Value.newBuilder().setStringValue("21").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("55").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain").build())
            .addValues(Value.newBuilder().setStringValue("75").build())
            .build())
        .build();

    deIdentifyTableConditionMasking(projectId, tableToDeIdentify);
  }

  public static Table deIdentifyTableConditionMasking(String projectId, Table tableToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify what content you want the service to de-identify.
      ContentItem contentItem = ContentItem.newBuilder().setTable(tableToDeIdentify).build();

      // Specify how the content should be de-identified.
      CharacterMaskConfig characterMaskConfig =
          CharacterMaskConfig.newBuilder()
              .setMaskingCharacter("*")
              .build();
      PrimitiveTransformation primitiveTransformation =
          PrimitiveTransformation.newBuilder()
              .setCharacterMaskConfig(characterMaskConfig)
              .build();

      // Specify field to be de-identified.
      FieldId fieldId = FieldId.newBuilder().setName("HAPPINESS SCORE").build();

      // Specify when the above field should be de-identified.
      Condition condition = Condition.newBuilder()
          .setField(FieldId.newBuilder().setName("AGE").build())
          .setOperator(RelationalOperator.GREATER_THAN)
          .setValue(Value.newBuilder().setIntegerValue(89).build())
          .build();
      // Apply the condition to records
      RecordCondition recordCondition = RecordCondition.newBuilder()
          .setExpressions(Expressions.newBuilder()
              .setConditions(Conditions.newBuilder()
                  .addConditions(condition)
                  .build())
              .build())
          .build();

      // Associate the de-identification and conditions with the specified field.
      FieldTransformation fieldTransformation =
          FieldTransformation.newBuilder()
              .setPrimitiveTransformation(primitiveTransformation)
              .addFields(fieldId)
              .setCondition(recordCondition)
              .build();
      RecordTransformations transformations =
          RecordTransformations.newBuilder().addFieldTransformations(fieldTransformation).build();

      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder().setRecordTransformations(transformations).build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service.
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results.
      System.out.println(
          "Table after de-identification: " + response.getItem().getTable());

      return response.getItem().getTable();
    }
  }
}

API Explorer の例

"deidentifyConfig":{
  "recordTransformations":{
    "fieldTransformations":[
      {
        "fields":[
          {
            "name":"HAPPINESS SCORE"
          }
        ],
        "primitiveTransformation":{
          "characterMaskConfig":{
            "maskingCharacter":"*"
          }
        },
        "condition":{
          "expressions":{
            "conditions":{
              "conditions":[
                {
                  "field":{
                    "name":"AGE"
                  },
                  "operator":"GREATER_THAN",
                  "value":{
                    "integerValue":"89"
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

列内の検出結果を変換する

セルのコンテンツの一部、またはすべてを含む結果を変換できます。この例では、PERSON_NAME のインスタンスすべてが匿名化されます。

入力 変換後の表
年齢 患者 満足度スコア こぼれ話
101 チャールズ ディケンズ 95 チャールズ ディケンズの名前は、シェイクスピアによって考案されたとする説もあります。
22 ジェイン オースティン 21 ジェイン オースティンの小説にはキスシーンが 14 か所あります。
55 マーク トウェイン 75 マーク トウェインは猫が好きでした。
年齢 患者 満足度スコア こぼれ話
101 [PERSON_NAME] 95 [PERSON_NAME] の名前は、シェイクスピアによって考案されたとする説もあります。
22 [PERSON_NAME] 21 [PERSON_NAME] の小説にはキスシーンが 14 か所あります。
55 [PERSON_NAME] 75 [PERSON_NAME] は猫が好きでした。

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.FieldId;
import com.google.privacy.dlp.v2.FieldTransformation;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InfoTypeTransformations;
import com.google.privacy.dlp.v2.InfoTypeTransformations.InfoTypeTransformation;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.PrimitiveTransformation;
import com.google.privacy.dlp.v2.RecordTransformations;
import com.google.privacy.dlp.v2.ReplaceWithInfoTypeConfig;
import com.google.privacy.dlp.v2.Table;
import com.google.privacy.dlp.v2.Table.Row;
import com.google.privacy.dlp.v2.Value;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class DeIdentifyTableInfoTypes {

  public static void deIdentifyTableInfoTypes() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    Table tableToDeIdentify = Table.newBuilder()
        .addHeaders(FieldId.newBuilder().setName("AGE").build())
        .addHeaders(FieldId.newBuilder().setName("PATIENT").build())
        .addHeaders(FieldId.newBuilder().setName("HAPPINESS SCORE").build())
        .addHeaders(FieldId.newBuilder().setName("FACTOID").build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("101").build())
            .addValues(Value.newBuilder().setStringValue("Charles Dickens").build())
            .addValues(Value.newBuilder().setStringValue("95").build())
            .addValues(Value.newBuilder().setStringValue(
                "Charles Dickens name was a curse, possibly invented by Shakespeare.").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("22").build())
            .addValues(Value.newBuilder().setStringValue("Jane Austen").build())
            .addValues(Value.newBuilder().setStringValue("21").build())
            .addValues(Value.newBuilder().setStringValue(
                "There are 14 kisses in Jane Austen's novels.").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("55").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain").build())
            .addValues(Value.newBuilder().setStringValue("75").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain loved cats.").build())
            .build())
        .build();

    deIdentifyTableInfoTypes(projectId, tableToDeIdentify);
  }

  public static Table deIdentifyTableInfoTypes(String projectId, Table tableToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify what content you want the service to de-identify.
      ContentItem contentItem = ContentItem.newBuilder().setTable(tableToDeIdentify).build();

      // Specify how the content should be de-identified.
      // Select type of info to be replaced.
      InfoType infoType = InfoType.newBuilder().setName("PERSON_NAME").build();
      // Specify that findings should be replaced with corresponding info type name.
      ReplaceWithInfoTypeConfig replaceWithInfoTypeConfig =
          ReplaceWithInfoTypeConfig.getDefaultInstance();
      PrimitiveTransformation primitiveTransformation = PrimitiveTransformation.newBuilder()
          .setReplaceWithInfoTypeConfig(replaceWithInfoTypeConfig).build();
      // Associate info type with the replacement strategy
      InfoTypeTransformation infoTypeTransformation =
          InfoTypeTransformation.newBuilder()
              .addInfoTypes(infoType)
              .setPrimitiveTransformation(primitiveTransformation)
              .build();
      InfoTypeTransformations infoTypeTransformations =
          InfoTypeTransformations.newBuilder()
              .addTransformations(infoTypeTransformation)
              .build();

      // Specify fields to be de-identified.
      List<FieldId> fieldIds = Stream.of("PATIENT", "FACTOID")
          .map(id -> FieldId.newBuilder().setName(id).build())
          .collect(Collectors.toList());

      // Associate the de-identification and conditions with the specified field.
      FieldTransformation fieldTransformation =
          FieldTransformation.newBuilder()
              .setInfoTypeTransformations(infoTypeTransformations)
              .addAllFields(fieldIds)
              .build();
      RecordTransformations transformations =
          RecordTransformations.newBuilder().addFieldTransformations(fieldTransformation).build();

      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder().setRecordTransformations(transformations).build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service.
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results.
      System.out.println(
          "Table after de-identification: " + response.getItem().getTable());

      return response.getItem().getTable();
    }
  }
}

API Explorer の例

"deidentifyConfig":{
  "recordTransformations":{
    "fieldTransformations":[
      {
        "infoTypeTransformations":{
          "transformations":[
            {
              "infoTypes":[
                {
                  "name":"PERSON_NAME"
                }
              ],
              "primitiveTransformation":{
                "replaceWithInfoTypeConfig":{

                }
              }
            }
          ]
        },
        "fields":[
          {
            "name":"PATIENT"
          },
          {
            "name":"FACTOID"
          }
        ]
      }
    ]
  }
}

列のコンテンツに基づいて行を非表示にする

列の内容に基づいて 1 行すべてを削除できます。この例では、89 歳を超える年齢のため、「チャールズ ディケンズ」の行を非表示にします。

入力 変換後の表
年齢 患者 満足度スコア
101 チャールズ ディケンズ 95
22 ジェイン オースティン 21
55 マーク トウェイン 75
年齢 患者 満足度スコア
22 ジェイン オースティン 21
55 マーク トウェイン 75

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.FieldId;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.RecordCondition;
import com.google.privacy.dlp.v2.RecordCondition.Condition;
import com.google.privacy.dlp.v2.RecordCondition.Conditions;
import com.google.privacy.dlp.v2.RecordCondition.Expressions;
import com.google.privacy.dlp.v2.RecordSuppression;
import com.google.privacy.dlp.v2.RecordTransformations;
import com.google.privacy.dlp.v2.RelationalOperator;
import com.google.privacy.dlp.v2.Table;
import com.google.privacy.dlp.v2.Table.Row;
import com.google.privacy.dlp.v2.Value;
import java.io.IOException;

public class DeIdentifyTableRowSuppress {

  public static void deIdentifyTableRowSuppress() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    Table tableToDeIdentify = Table.newBuilder()
        .addHeaders(FieldId.newBuilder().setName("AGE").build())
        .addHeaders(FieldId.newBuilder().setName("PATIENT").build())
        .addHeaders(FieldId.newBuilder().setName("HAPPINESS SCORE").build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("101").build())
            .addValues(Value.newBuilder().setStringValue("Charles Dickens").build())
            .addValues(Value.newBuilder().setStringValue("95").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("22").build())
            .addValues(Value.newBuilder().setStringValue("Jane Austen").build())
            .addValues(Value.newBuilder().setStringValue("21").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("55").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain").build())
            .addValues(Value.newBuilder().setStringValue("75").build())
            .build())
        .build();

    deIdentifyTableRowSuppress(projectId, tableToDeIdentify);
  }

  public static Table deIdentifyTableRowSuppress(String projectId, Table tableToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify what content you want the service to de-identify.
      ContentItem contentItem = ContentItem.newBuilder().setTable(tableToDeIdentify).build();

      // Specify when the content should be de-identified.
      Condition condition = Condition.newBuilder()
          .setField(FieldId.newBuilder().setName("AGE").build())
          .setOperator(RelationalOperator.GREATER_THAN)
          .setValue(Value.newBuilder().setIntegerValue(89).build()).build();
      // Apply the condition to record suppression.
      RecordSuppression recordSuppressions =
          RecordSuppression.newBuilder()
              .setCondition(RecordCondition.newBuilder()
                  .setExpressions(Expressions.newBuilder()
                      .setConditions(Conditions.newBuilder().addConditions(condition).build())
                      .build())
                  .build())
              .build();
      // Use record suppression as the only transformation
      RecordTransformations transformations =
          RecordTransformations.newBuilder()
              .addRecordSuppressions(recordSuppressions)
              .build();

      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder().setRecordTransformations(transformations).build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service.
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results.
      System.out.println(
          "Table after de-identification: " + response.getItem().getTable());

      return response.getItem().getTable();
    }
  }
}

API Explorer の例

"deidentifyConfig":{
  "recordTransformations":{
    "recordSuppressions":[
      {
        "condition":{
          "expressions":{
            "conditions":{
              "conditions":[
                {
                  "field":{
                    "name":"AGE"
                  },
                  "operator":"GREATER_THAN",
                  "value":{
                    "integerValue":"89"
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

別のフィールドで特定の条件が満たされた場合にのみ検査結果を変換する

この例では、PERSON_NAME の結果は、「AGE」列によって患者が 89 歳を超えていることが示される場合にのみ削除されます。

入力 変換後の表
年齢 患者 満足度スコア こぼれ話
101 チャールズ ディケンズ 95 チャールズ ディケンズの名前は、シェイクスピアによって考案されたとする説もあります。
22 ジェイン オースティン 21 ジェイン オースティンの小説にはキスシーンが 14 か所あります。
55 マーク トウェイン 75 マーク トウェインは猫が好きでした。
年齢 患者 満足度スコア こぼれ話
101 [PERSON_NAME] 95 [PERSON_NAME] の名前は、[PERSON_NAME] によって考案されたとする説もあります。
22 ジェイン オースティン 21 ジェイン オースティンの小説にはキスシーンが 14 か所あります。
55 マーク トウェイン 75 マーク トウェインは猫が好きでした。

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.FieldId;
import com.google.privacy.dlp.v2.FieldTransformation;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InfoTypeTransformations;
import com.google.privacy.dlp.v2.InfoTypeTransformations.InfoTypeTransformation;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.PrimitiveTransformation;
import com.google.privacy.dlp.v2.RecordCondition;
import com.google.privacy.dlp.v2.RecordCondition.Condition;
import com.google.privacy.dlp.v2.RecordCondition.Conditions;
import com.google.privacy.dlp.v2.RecordCondition.Expressions;
import com.google.privacy.dlp.v2.RecordTransformations;
import com.google.privacy.dlp.v2.RelationalOperator;
import com.google.privacy.dlp.v2.ReplaceWithInfoTypeConfig;
import com.google.privacy.dlp.v2.Table;
import com.google.privacy.dlp.v2.Table.Row;
import com.google.privacy.dlp.v2.Value;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class DeIdentifyTableConditionInfoTypes {

  public static void deIdentifyTableConditionInfoTypes() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    Table tableToDeIdentify = Table.newBuilder()
        .addHeaders(FieldId.newBuilder().setName("AGE").build())
        .addHeaders(FieldId.newBuilder().setName("PATIENT").build())
        .addHeaders(FieldId.newBuilder().setName("HAPPINESS SCORE").build())
        .addHeaders(FieldId.newBuilder().setName("FACTOID").build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("101").build())
            .addValues(Value.newBuilder().setStringValue("Charles Dickens").build())
            .addValues(Value.newBuilder().setStringValue("95").build())
            .addValues(Value.newBuilder().setStringValue(
                "Charles Dickens name was a curse, possibly invented by Shakespeare.").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("22").build())
            .addValues(Value.newBuilder().setStringValue("Jane Austen").build())
            .addValues(Value.newBuilder().setStringValue("21").build())
            .addValues(Value.newBuilder().setStringValue(
                "There are 14 kisses in Jane Austen's novels.").build())
            .build())
        .addRows(Row.newBuilder()
            .addValues(Value.newBuilder().setStringValue("55").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain").build())
            .addValues(Value.newBuilder().setStringValue("75").build())
            .addValues(Value.newBuilder().setStringValue("Mark Twain loved cats.").build())
            .build())
        .build();

    deIdentifyTableConditionInfoTypes(projectId, tableToDeIdentify);
  }

  public static Table deIdentifyTableConditionInfoTypes(String projectId, Table tableToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify what content you want the service to de-identify.
      ContentItem contentItem = ContentItem.newBuilder().setTable(tableToDeIdentify).build();

      // Specify how the content should be de-identified.
      // Select type of info to be replaced.
      InfoType infoType = InfoType.newBuilder().setName("PERSON_NAME").build();
      // Specify that findings should be replaced with corresponding info type name.
      ReplaceWithInfoTypeConfig replaceWithInfoTypeConfig =
          ReplaceWithInfoTypeConfig.getDefaultInstance();
      PrimitiveTransformation primitiveTransformation = PrimitiveTransformation.newBuilder()
          .setReplaceWithInfoTypeConfig(replaceWithInfoTypeConfig).build();
      // Associate info type with the replacement strategy
      InfoTypeTransformation infoTypeTransformation =
          InfoTypeTransformation.newBuilder()
              .addInfoTypes(infoType)
              .setPrimitiveTransformation(primitiveTransformation)
              .build();
      InfoTypeTransformations infoTypeTransformations =
          InfoTypeTransformations.newBuilder()
              .addTransformations(infoTypeTransformation)
              .build();

      // Specify fields to be de-identified.
      List<FieldId> fieldIds = Stream.of("PATIENT", "FACTOID")
          .map(id -> FieldId.newBuilder().setName(id).build())
          .collect(Collectors.toList());

      // Specify when the above fields should be de-identified.
      Condition condition = Condition.newBuilder()
          .setField(FieldId.newBuilder().setName("AGE").build())
          .setOperator(RelationalOperator.GREATER_THAN)
          .setValue(Value.newBuilder().setIntegerValue(89).build())
          .build();
      // Apply the condition to records
      RecordCondition recordCondition = RecordCondition.newBuilder()
          .setExpressions(Expressions.newBuilder()
              .setConditions(Conditions.newBuilder()
                  .addConditions(condition)
                  .build())
              .build())
          .build();

      // Associate the de-identification and conditions with the specified fields.
      FieldTransformation fieldTransformation =
          FieldTransformation.newBuilder()
              .setInfoTypeTransformations(infoTypeTransformations)
              .addAllFields(fieldIds)
              .setCondition(recordCondition)
              .build();
      RecordTransformations transformations =
          RecordTransformations.newBuilder().addFieldTransformations(fieldTransformation).build();

      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder().setRecordTransformations(transformations).build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service.
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results.
      System.out.println(
          "Table after de-identification: " + response.getItem().getTable());

      return response.getItem().getTable();
    }
  }
}

API Explorer の例

"deidentifyConfig":{
  "recordTransformations":{
    "fieldTransformations":[
      {
        "infoTypeTransformations":{
          "transformations":[
            {
              "infoTypes":[
                {
                  "name":"PERSON_NAME"
                }
              ],
              "primitiveTransformation":{
                "replaceWithInfoTypeConfig":{

                }
              }
            }
          ]
        },
        "fields":[
          {
            "name":"PATIENT"
          },
          {
            "name":"FACTOID"
          }
        ],
        "condition":{
          "expressions":{
            "conditions":{
              "conditions":[
                {
                  "field":{
                    "name":"AGE"
                  },
                  "operator":"GREATER_THAN",
                  "value":{
                    "integerValue":"89"
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

暗号ハッシュ変換を使用して検出結果を変換する

次の JSON の例では、infoType 変換を使用して、Cloud DLP API に特定の infoType がないか表構造全体を検査する指示を出し、続いて一時的な CryptoKey を使用して一致する値を暗号化します。

次の例では、暗号ハッシュ変換を使用して 2 つの infoType を匿名化します。

入力:

userid comments
user1@example.org メールアドレスは user1@example.org、電話番号は 858-555-0222
user2@example.org メールアドレスは user2@example.org、電話番号は 858-555-0223
user3@example.org メールアドレスは user3@example.org、電話番号は 858-555-0224

変換後の表:

userid comments
1kSfj3Op64MH1BiznupEpX0BdQrHMm62X6abgsPH5zM= メールアドレスは 1kSfj3Op64MH1BiznupEpX0BdQrHMm62X6abgsPH5zM=、電話番号は hYXPcsJNBCe1rr51sHiVw2KhtoyMe4HEFKNHWFcDVm0=
4ESy7+rEN8NVaUJ6J7kwvcgW8wcm0cm5gbBAcu6SfdM= メールアドレスは 4ESy7+rEN8NVaUJ6J7kwvcgW8wcm0cm5gbBAcu6SfdM=、電話番号は KKqW1tQwgvGiC6iWJHhLiz2enNSEFRzhmLOf9fSTxRw=
bu1blyd/mbjLmpF2Rdi6zpgsLatSwpJLVki2fMeudM0= メールアドレスは bu1blyd/mbjLmpF2Rdi6zpgsLatSwpJLVki2fMeudM0=、電話番号は eNt7qtZVLmxRb8z8NBR/+z00In07CI3hEMStbwofWoc=

API Explorer の例

{
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"EMAIL_ADDRESS"
      },
      {
        "name":"PHONE_NUMBER"
      }
    ]
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"EMAIL_ADDRESS"
            },
            {
              "name":"PHONE_NUMBER"
            }
          ],
          "primitiveTransformation":{
            "cryptoHashConfig":{
              "cryptoKey":{
                "transient":{
                  "name":"[TRANSIENT-CRYPTO-KEY]"
                }
              }
            }
          }
        }
      ]
    }
  },
  "item":{
    "table":{
      "headers":[
        {
          "name":"userid"
        },
        {
          "name":"comments"
        }
      ],
      "rows":[
        {
          "values":[
            {
              "stringValue":"abby_abernathy@example.org"
            },
            {
              "stringValue":"my email is abby_abernathy@example.org and phone is 858-555-0222"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"bert_beauregard@example.org"
            },
            {
              "stringValue":"my email is bert_beauregard@example.org and phone is 858-555-0223"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"cathy_crenshaw@example.org"
            },
            {
              "stringValue":"my email is cathy_crenshaw@example.org and phone is 858-555-0224"
            }
          ]
        }
      ]
    }
  }
}

2 つの別々の暗号ハッシュ変換を使用して検出結果を変換する

この例では、1 つの匿名化構成内のさまざまな変換において複数の異なる暗号鍵を使用する方法を示します。まず、[userid] フィールドのフィールド変換が宣言されます。この変換には infoType 変換は含まれないため、各行の [userid] フィールドはそのデータ型に関係なく変換されます。次に、[comments] フィールドで別のフィールド変換が宣言されます。

入力:

userid comments
user1@example.org メールアドレスは user1@example.org、電話番号は 858-555-0222
abbyabernathy1 ユーザー ID は abyabernathy1、メールアドレスは aabernathy@example.com

変換後の表:

userid comments
5WvS4+aJtCCwWWG79cmRNamDgyvJ+CkuwNpA2gaR1VQ= メールアドレスは vjqGLaA6+NUUnZAWXpI72lU1GfwQdOKu7XqWaJPcvQQ=、電話番号は BY+mSXXTu6mOoX5pr0Xbse60uelsSHmwRCq6HcscKtk=
t0dOmHvkT0VsM++SVmESVKHenLkmhBmFezH3hSDldDg= ユーザー ID は abbyabernathy1、メールアドレスは TQ3ancdUn9zgwO5qe6ahkmVrBuNhvlMknxjPjIt0N2w=

API Explorer の例

{
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"EMAIL_ADDRESS"
      },
      {
        "name":"PHONE_NUMBER"
      }
    ]
  },
  "deidentifyConfig":{
    "recordTransformations":{
      "fieldTransformations":[
        {
          "fields":[
            {
              "name":"userid"
            }
          ],
          "primitiveTransformation":{
            "cryptoHashConfig":{
              "cryptoKey":{
                "transient":{
                  "name":"[TRANSIENT-CRYPTO-KEY-1]"
                }
              }
            }
          }
        },
        {
          "fields":[
            {
              "name":"comments"
            }
          ],
          "infoTypeTransformations":{
            "transformations":[
              {
                "infoTypes":[
                  {
                    "name":"PHONE_NUMBER"
                  },
                  {
                    "name":"EMAIL_ADDRESS"
                  }
                ],
                "primitiveTransformation":{
                  "cryptoHashConfig":{
                    "cryptoKey":{
                      "transient":{
                        "name":"[TRANSIENT-CRYPTO-KEY-2]"
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "item":{
    "table":{
      "headers":[
        {
          "name":"userid"
        },
        {
          "name":"comments"
        }
      ],
      "rows":[
        {
          "values":[
            {
              "stringValue":"user1@example.org"
            },
            {
              "stringValue":"my email is user1@example.org and phone is 858-333-2222"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"abbyabernathy1"
            },
            {
              "stringValue":"my userid is abbyabernathy1 and my email is aabernathy@example.com"
            }
          ]
        }
      ]
    }
  }
}