InfoType 和 InfoType 检测器

敏感数据保护使用信息类型(也称为 infoType)来定义需要在扫描中查找的内容。infoType 是一种敏感数据类型,如姓名、电子邮件地址、电话号码、身份证号码和信用卡号等等。infoType 检测器是指依据 infoType 的匹配条件进行匹配的相应检测机制。

选择 infoType 的最佳实践

了解您的数据是保护数据的第一步。最佳实践是,您应仅收集、存储和处理业务所需的信息。通过识别您所处理的数据,您可以为您的业务、用户以及数据安全和隐私保护状况做出明智的决策。

您的某些业务用例可能需要使用某些敏感信息,而另一些用例可能不需要。没有一种解决方案能够支持所有用例。因此,Sensitive Data Protection 提供了对要扫描的数据类型的灵活控制。如果您使用 infoType 进行去标识化或脱敏,还可以控制数据的转换时间和方式。

一般准则

选择 infoType 时,请考虑以下一般准则。

您无需收集的敏感信息

贵商家中的每项服务都应仅收集该服务所需的数据。例如,贵商家的某些服务无需收集财务信息。对于这些服务,不妨考虑启用 CREDIT_CARD_NUMBERFINANCIAL_ACCOUNT_NUMBER 等 infoType 检测器,以及行业类别 FINANCE 中的其他 infoType。

您需要收集但不想广泛分享给团队的信息

收集个人信息可能有合理的用例,但您不应与团队广泛分享个人信息。例如,提交支持服务工单的客户可能会向您提供联系信息,以便您与他们联系来解决任何问题。您不希望团队中查看工单的所有人都能看到个人身份信息 (PII)。考虑启用 PHONE_NUMBEREMAIL_ADDRESS 等 infoType 检测器,以及类型类别 PII 中的其他 infoType。

受行业、数据隐私或管辖区法规约束的敏感数据类别

某些信息类型因其发放方式或用途而被视为敏感信息。在其他情况下,情境信息和受众特征信息被视为受保护类别。这些类型的信息在收集、使用和管理方面可能受到额外限制。考虑启用以下类别的 infoType 检测器:

在类似的 infoType 之间进行选择

在选择类似的 infoType 检测器时,请考虑以下事项。

护照

如果您不需要扫描特定国家/地区的护照识别信息,请选择通用检测器:PASSPORT

某些特定国家/地区的护照检测器(例如 UK_PASSPORT)可供使用。不过,某些特定国家/地区的护照检测器只能识别采用特定格式或存在情境线索的护照。

用户姓名

扫描人物姓名时,对于大多数用例,请使用 PERSON_NAME,而不是 FIRST_NAMELAST_NAME

PERSON_NAME 是人名检测器。包括单字名字和全名。例如,此检测器会尝试使用各种技术(包括自然语言理解)检测简·史密斯简·玛丽·史密斯等名称。FIRST_NAMELAST_NAME 是此检测器的子集,用于尝试识别名称的部分。这些检测器的发现结果始终是 PERSON_NAME 发现结果的子集。

日期和时间

如果您不需要扫描所有日期,请考虑使用 DATE_OF_BIRTH 等定位日期的检测器。此检测器会尝试识别表明日期与个人出生日期相关的上下文。

DATE 检测器会尝试查找所有日期,无论上下文如何。它还会标记相对日期,例如今天昨天。同样,TIME 会尝试查找所有时间戳。

位置

如果您不需要扫描所有位置,请考虑使用 STREET_ADDRESS 而非 LOCATION 检测器。STREET_ADDRESS 检测器会尝试查找完全限定的地址,此类地址通常比通用位置更精确,也更敏感。

LOCATION infoType 检测器会尝试查找任何地理位置,无论上下文如何,例如 ParisCanada

需要情境的 InfoType 检测器

许多 infoType 检测器都需要存在情境线索,才能识别匹配项。如果内置 infoType 检测器未标记您预期要标记的项,因为这些项附近没有出现任何上下文线索,那么不妨考虑改用 GENERIC_ID自定义 infoType 检测器

缺少通用行业定义的信息类型

某些信息类型缺少通用的行业定义。例如,医疗记录编号、账号、PIN 码和安全码。对于这些类型,请考虑使用 GENERIC_IDFINANCIAL_ACCOUNT_NUMBERMEDICAL_RECORD_NUMBER 等 InfoType。这些检测器会结合使用实体检测和情境来查找可能敏感的元素。

延迟时间较长的 infoType 检测器

  • 避免启用不需要的 infoType 检测器。虽然以下 infoType 在某些情况下很有用,但与不包含这些 infoType 的请求相比,包含这些 infoType 的请求的运行速度可能会慢得多:

    • PERSON_NAME
    • FEMALE_NAME
    • MALE_NAME
    • FIRST_NAME
    • LAST_NAME
    • DATE_OF_BIRTH
    • LOCATION
    • STREET_ADDRESS
    • ORGANIZATION_NAME
  • 始终明确指定 infoType 检测器。请勿使用空的 infoTypes 列表。

如何使用 infoType

Sensitive Data Protection 在扫描配置中使用 infoType 检测器来确定要检查的内容以及如何转换发现结果。显示或报告扫描结果时也会使用 infoType 名称。

例如,如果要在文本块中查找电子邮件地址,您可以在检查配置中指定 EMAIL_ADDRESS 这种 infoType 检测器。如果要隐去文本块中的电子邮件地址,您可以在检查配置和去标识化配置中指定 EMAIL_ADDRESS 来指示如何隐去或转换该类型。

此外,您可以结合使用内置和自定义的 infoType 检测器来从扫描结果中排除一部分电子邮件地址。首先,创建一个名为 INTERNAL_EMAIL_ADDRESS 的自定义 infoType,并将其配置为排除内部测试电子邮件地址。然后,您可以设置扫描以纳入 EMAIL_ADDRESS 的结果,再添加排除规则以排除与 INTERNAL_EMAIL_ADDRESS 匹配的任何结果。如需详细了解自定义 infoType 检测器的排除规则和其他功能,请参阅创建自定义 infoType 检测器

Sensitive Data Protection 提供了一组可以按名称指定的内置 infoType 检测器,每个检测器都列在 InfoType 检测器参考文档中。这些检测器使用各种方法来发现每种类型并对其进行分类。例如,一些类型要求进行模式匹配,一些类型可能有数学校验和,一些类型有特殊的数字限制,还有一些类型则可能有具体的前缀或结果上下文。

示例

设置 Sensitive Data Protection 以扫描内容时,请添加要在扫描配置中使用的 infoType 检测器。

例如,以下 JSON 和代码示例演示了对 DLP API 的简单扫描请求。请注意,inspectConfig 中指定了 PHONE_NUMBER 检测器,用于指示敏感数据保护功能扫描给定字符串中的手机号码。

C#

如需了解如何安装和使用敏感数据保护客户端库,请参阅 敏感数据保护客户端库

如需向 Sensitive Data Protection 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证


using System;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.Dlp.V2;

public class InspectPhoneNumber
{
    public static InspectContentResponse Inspect(
        string projectId,
        string text,
        Likelihood minLikelihood = Likelihood.Possible)
    {
        // Instantiate a client.
        var dlp = DlpServiceClient.Create();

        // Set content item.
        var contentItem = new ContentItem { Value = text };

        // Construct inspect config.
        var inspectConfig = new InspectConfig
        {
            InfoTypes = { new InfoType { Name = "PHONE_NUMBER" } },
            IncludeQuote = true,
            MinLikelihood = minLikelihood
        };

        // Construct a request.
        var request = new InspectContentRequest
        {
            ParentAsLocationName = new LocationName(projectId, "global"),
            InspectConfig = inspectConfig,
            Item = contentItem,
        };

        // Call the API.
        var response = dlp.InspectContent(request);

        // Inspect the results.
        var resultFindings = response.Result.Findings;

        Console.WriteLine($"Findings: {resultFindings.Count}");

        foreach (var f in resultFindings)
        {
            Console.WriteLine("\tQuote: " + f.Quote);
            Console.WriteLine("\tInfo type: " + f.InfoType.Name);
            Console.WriteLine("\tLikelihood: " + f.Likelihood);
        }

        return response;
    }
}

Go

如需了解如何安装和使用敏感数据保护客户端库,请参阅 敏感数据保护客户端库

如需向 Sensitive Data Protection 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import (
	"context"
	"fmt"
	"io"

	dlp "cloud.google.com/go/dlp/apiv2"
	"cloud.google.com/go/dlp/apiv2/dlppb"
)

// inspectPhoneNumber demonstrates a simple scan request to the Cloud DLP API.
// Notice that the PHONE_NUMBER detector is specified in inspectConfig,
// which instructs Cloud DLP to scan the given string for a phone number.
func inspectPhoneNumber(w io.Writer, projectID, textToInspect string) error {
	// projectID := "my-project-id"
	// textToInspect := "My phone number is (123) 555-6789"

	ctx := context.Background()

	// Initialize a client once and reuse it to send multiple requests. Clients
	// are safe to use across goroutines. When the client is no longer needed,
	// call the Close method to cleanup its resources.
	client, err := dlp.NewClient(ctx)
	if err != nil {
		return err
	}
	// Closing the client safely cleans up background resources.
	defer client.Close()

	// Create and send the request.
	req := &dlppb.InspectContentRequest{
		Parent: fmt.Sprintf("projects/%s/locations/global", projectID),
		Item: &dlppb.ContentItem{
			DataItem: &dlppb.ContentItem_Value{
				Value: textToInspect,
			},
		},
		InspectConfig: &dlppb.InspectConfig{
			// Specify the type of info the inspection will look for.
			// See https://cloud.google.com/dlp/docs/infotypes-reference
			// for complete list of info types
			InfoTypes: []*dlppb.InfoType{
				{Name: "PHONE_NUMBER"},
			},
			IncludeQuote: true,
		},
	}

	// Send the request.
	resp, err := client.InspectContent(ctx, req)
	if err != nil {
		fmt.Fprintf(w, "receive: %v", err)
		return err
	}

	// Process the results.
	result := resp.Result
	fmt.Fprintf(w, "Findings: %d\n", len(result.Findings))
	for _, f := range result.Findings {
		fmt.Fprintf(w, "\tQuote: %s\n", f.Quote)
		fmt.Fprintf(w, "\tInfo type: %s\n", f.InfoType.Name)
		fmt.Fprintf(w, "\tLikelihood: %s\n", f.Likelihood)
	}
	return nil
}

Java

如需了解如何安装和使用敏感数据保护客户端库,请参阅 敏感数据保护客户端库

如需向 Sensitive Data Protection 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.Finding;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.InspectContentRequest;
import com.google.privacy.dlp.v2.InspectContentResponse;
import com.google.privacy.dlp.v2.Likelihood;
import com.google.privacy.dlp.v2.LocationName;
import java.io.IOException;

public class InspectPhoneNumber {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String textToInspect = "My name is Gary and my email is gary@example.com";
    inspectString(projectId, textToInspect);
  }

  // Inspects the provided text.
  public static void inspectString(String projectId, String textToInspect) 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 the type and content to be inspected.
      ContentItem item = ContentItem.newBuilder().setValue(textToInspect).build();

      // Specify the type of info the inspection will look for.
      // See https://cloud.google.com/dlp/docs/infotypes-reference for complete list of info types
      InfoType infoType = InfoType.newBuilder().setName("PHONE_NUMBER").build();

      // Construct the configuration for the Inspect request.
      InspectConfig config =
          InspectConfig.newBuilder()
              .setIncludeQuote(true)
              .setMinLikelihood(Likelihood.POSSIBLE)
              .addInfoTypes(infoType)
              .build();

      // Construct the Inspect request to be sent by the client.
      InspectContentRequest request =
          InspectContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(item)
              .setInspectConfig(config)
              .build();

      // Use the client to send the API request.
      InspectContentResponse response = dlp.inspectContent(request);

      // Parse the response and process results
      System.out.println("Findings: " + response.getResult().getFindingsCount());
      for (Finding f : response.getResult().getFindingsList()) {
        System.out.println("\tQuote: " + f.getQuote());
        System.out.println("\tInfo type: " + f.getInfoType().getName());
        System.out.println("\tLikelihood: " + f.getLikelihood());
      }
    }
  }
}

Node.js

如需了解如何安装和使用敏感数据保护客户端库,请参阅 敏感数据保护客户端库

如需向 Sensitive Data Protection 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

// Imports the Google Cloud Data Loss Prevention library
const DLP = require('@google-cloud/dlp');

// Instantiates a client
const dlp = new DLP.DlpServiceClient();

// The project ID to run the API call under
// const projectId = 'my-project';

// The string to inspect
// const string = 'My email is gary@example.com and my phone number is (223) 456-7890.';

// The minimum likelihood required before returning a match
// const minLikelihood = 'LIKELIHOOD_UNSPECIFIED';

// The maximum number of findings to report per request (0 = server maximum)
// const maxFindings = 0;

// The infoTypes of information to match
// See https://cloud.google.com/dlp/docs/concepts-infotypes for more information
// about supported infoTypes.
// const infoTypes = [{ name: 'PHONE_NUMBER' }];

// The customInfoTypes of information to match
// const customInfoTypes = [{ infoType: { name: 'DICT_TYPE' }, dictionary: { wordList: { words: ['foo', 'bar', 'baz']}}},
//   { infoType: { name: 'REGEX_TYPE' }, regex: {pattern: '\\(\\d{3}\\) \\d{3}-\\d{4}'}}];

// Whether to include the matching string
// const includeQuote = true;

async function inspectPhoneNumber() {
  // Construct item to inspect
  const item = {value: string};

  // Construct request
  const request = {
    parent: `projects/${projectId}/locations/global`,
    inspectConfig: {
      infoTypes: infoTypes,
      customInfoTypes: customInfoTypes,
      minLikelihood: minLikelihood,
      includeQuote: includeQuote,
      limits: {
        maxFindingsPerRequest: maxFindings,
      },
    },
    item: item,
  };

  // Run request
  const [response] = await dlp.inspectContent(request);
  const findings = response.result.findings;
  if (findings.length > 0) {
    console.log('Findings:');
    findings.forEach(finding => {
      if (includeQuote) {
        console.log(`\tQuote: ${finding.quote}`);
      }
      console.log(`\tInfo type: ${finding.infoType.name}`);
      console.log(`\tLikelihood: ${finding.likelihood}`);
    });
  } else {
    console.log('No findings.');
  }
}
inspectPhoneNumber();

PHP

如需了解如何安装和使用敏感数据保护客户端库,请参阅 敏感数据保护客户端库

如需向 Sensitive Data Protection 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

use Google\Cloud\Dlp\V2\Client\DlpServiceClient;
use Google\Cloud\Dlp\V2\ContentItem;
use Google\Cloud\Dlp\V2\InfoType;
use Google\Cloud\Dlp\V2\InspectConfig;
use Google\Cloud\Dlp\V2\InspectContentRequest;
use Google\Cloud\Dlp\V2\Likelihood;

/**
 * Inspect data for phone numbers
 * Demonstrates a simple scan request to the Cloud DLP API. Notice that the PHONE_NUMBER detector is specified in inspectConfig, which instructs Cloud DLP to scan the given string for a phone number.
 *
 * @param string $projectId         The Google Cloud project id to use as a parent resource.
 * @param string $textToInspect     The string to inspect.
 */
function inspect_phone_number(
    // TODO(developer): Replace sample parameters before running the code.
    string $projectId,
    string $textToInspect = 'My name is Gary and my phone number is (415) 555-0890'
): void {
    // Instantiate a client.
    $dlp = new DlpServiceClient();

    $parent = "projects/$projectId/locations/global";

    // Specify what content you want the service to Inspect.
    $item = (new ContentItem())
        ->setValue($textToInspect);

    $inspectConfig = (new InspectConfig())
        // The infoTypes of information to match
        ->setInfoTypes([
            (new InfoType())->setName('PHONE_NUMBER'),
        ])
        // Whether to include the matching string
        ->setIncludeQuote(true)
        ->setMinLikelihood(Likelihood::POSSIBLE);

    // Run request
    $inspectContentRequest = (new InspectContentRequest())
        ->setParent($parent)
        ->setInspectConfig($inspectConfig)
        ->setItem($item);
    $response = $dlp->inspectContent($inspectContentRequest);

    // Print the results
    $findings = $response->getResult()->getFindings();
    if (count($findings) == 0) {
        printf('No findings.' . PHP_EOL);
    } else {
        printf('Findings:' . PHP_EOL);
        foreach ($findings as $finding) {
            printf('  Quote: %s' . PHP_EOL, $finding->getQuote());
            printf('  Info type: %s' . PHP_EOL, $finding->getInfoType()->getName());
            printf('  Likelihood: %s' . PHP_EOL, Likelihood::name($finding->getLikelihood()));
        }
    }
}

Python

如需了解如何安装和使用敏感数据保护客户端库,请参阅 敏感数据保护客户端库

如需向 Sensitive Data Protection 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import google.cloud.dlp


def inspect_phone_number(
    project: str,
    content_string: str,
) -> None:
    """Uses the Data Loss Prevention API to analyze strings for protected data.
    Args:
        project: The Google Cloud project id to use as a parent resource.
        content_string: The string to inspect phone number from.
    """

    # Instantiate a client.
    dlp = google.cloud.dlp_v2.DlpServiceClient()

    # Prepare info_types by converting the list of strings into a list of
    # dictionaries (protos are also accepted).
    info_types = [{"name": "PHONE_NUMBER"}]

    # Construct the configuration dictionary.
    inspect_config = {
        "info_types": info_types,
        "include_quote": True,
    }

    # Construct the `item`.
    item = {"value": content_string}

    # Convert the project id into a full resource id.
    parent = f"projects/{project}"

    # Call the API.
    response = dlp.inspect_content(
        request={"parent": parent, "inspect_config": inspect_config, "item": item}
    )

    # Print out the results.
    if response.result.findings:
        for finding in response.result.findings:
            print(f"Quote: {finding.quote}")
            print(f"Info type: {finding.info_type.name}")
            print(f"Likelihood: {finding.likelihood}")
    else:
        print("No findings.")

REST

JSON 输入:

POST https://dlp.googleapis.com/v2/projects/[PROJECT-ID]/content:inspect?key={YOUR_API_KEY}

{
  "item":{
    "value":"My phone number is (415) 555-0890"
  },
  "inspectConfig":{
    "includeQuote":true,
    "minLikelihood":"POSSIBLE",
    "infoTypes":{
      "name":"PHONE_NUMBER"
    }
  }
}

当您将上述请求发送到指定端点后,敏感数据保护功能将返回以下内容:

JSON 输出:

{
  "result":{
    "findings":[
      {
        "quote":"(415) 555-0890",
        "infoType":{
          "name":"PHONE_NUMBER"
        },
        "likelihood":"VERY_LIKELY",
        "location":{
          "byteRange":{
            "start":"19",
            "end":"33"
          },
          "codepointRange":{
            "start":"19",
            "end":"33"
          }
        },
        "createTime":"2018-10-29T23:46:34.535Z"
      }
    ]
  }
}

您必须在检查配置中指定参考文档中列出的特定 infoType。如果您未指定任何 infoType,敏感数据保护功能将使用默认的 infoType 列表,该列表仅用于测试目的。默认列表可能不适合您的用例。

如需详细了解如何使用 infoType 检测器扫描内容,请参阅其中一个有关检查、遮盖或去标识化的操作方法主题

确定性和测试

系统在报告结果时会提供一个称为可能性的确定性分数。可能性分数表示结果与相应类型匹配的可能性有多高。例如,如果类型仅与模式匹配,可能会返回较低的可能性;如果类型与模式匹配且旁边有肯定的上下文,则会返回较高的可能性。由于这个原因,您也许会注意到同一个结果可能以较低的得分匹配多种类型。此外,如果结果匹配不充分,或者旁边有否定的上下文,可能就不会出现或其确定性可能较低。例如,如果结果与指定 infoType 的结构匹配,但未通过 infoType 的校验和,系统可能就不会报告此结果。或者,如果结果与多种 infoType 匹配,但上下文显示其与其中一种类型的匹配度更高,系统将仅针对该类型报告此结果。

如果您测试不同的检测器,可能会发现系统不会报告虚构数据或样本数据,因为虚构数据或样本数据无法通过足够多的检查。

infoType 检测器的种类

敏感数据保护包括多种 infoType 检测器,下方汇总了所有这些检测器:

  • 内置 infoType 检测器内置于敏感数据保护中。其中包括适用于某个国家/区域特有的敏感数据类型的检测器以及适用于全球通用数据类型的检测器。
  • 自定义 infoType 检测器 - 您自行创建的检测器。自定义 infoType 检测器有三种:
    • 小型自定义字典检测器 - 敏感数据保护用作匹配依据的简单字词列表。如果您有最多几万个字词或短语的列表,请使用小型自定义字典检测器。如果您预计字词列表不会发生显著变化,也建议首选小型自定义字典检测器。
    • 大型自定义字典检测器 - 由敏感数据保护功能使用 Cloud Storage 或 BigQuery 中存储的大量字词或短语生成。如果您有一个包含高达数千万个字词或短语的庞大列表,请使用大型自定义字典检测器。
    • 正则表达式 (regex) 检测器 - 使敏感数据保护功能能够基于正则表达式模式检测匹配项

此外,敏感数据保护还包含检查规则的概念,因此您可使用以下规则微调扫描结果:

  • 排除规则 - 让您可以通过向内置或自定义 infoType 检测器添加规则来减少返回的结果数量
  • 热词规则 - 让您可以通过向内置或自定义 infoType 检测器添加规则来增加返回的结果数量或更改其可能性值

内置 infoType 检测器

敏感数据保护内置了 infoType 检测器,其中包括针对特定国家/区域敏感数据类型的检测器,例如法国的 Numéro d'Inscription au Répertoire (NIR) (FRANCE_NIR)、英国驾照号码 (UK_DRIVERS_LICENSE_NUMBER) 和美国社会保障号 (US_SOCIAL_SECURITY_NUMBER)。还包括全球适用的数据类型,例如人名 (PERSON_NAME)、电话号码 (PHONE_NUMBER)、电子邮件地址 (EMAIL_ADDRESS) 和信用卡号 (CREDIT_CARD_NUMBER)。为了检测与 infoType 对应的内容,敏感数据保护会利用各种技术,包括模式匹配、校验和机器学习、情境分析等。

请务必更新内置 infoType 检测器列表。如需当前支持的内置 infoType 检测器的完整列表,请参阅 InfoType 检测器参考

您还可以通过调用敏感数据保护的 infoTypes.list 方法查看所有内置 infoType 检测器的完整列表。

语言支持

国家/地区特定的 infoType 支持英语和各个国家/地区的语言。大多数全球 infoType 支持多种语言。使用您的数据测试敏感数据保护功能,以验证它是否符合您的要求。

自定义 infoType 检测器

自定义 infoType 检测器有三种:

此外,Sensitive Data Protection 还包含检查规则,您可以通过将以下规则添加到现有检测器来微调扫描结果:

小型自定义字典检测器

使用小型自定义字典检测器(也称为“常规自定义字典检测器”)可以匹配最多几万个字词或短语的短列表。小型自定义字典可以作为自己的唯一检测器。

当您想要扫描的字词或短语列表不易通过正则表达式或内置检测器匹配时,则可以使用自定义字典检测器。例如,假设您想扫描那些通常用分配的房间名称而不是房间号码称呼的会议室(例如州或地区名称、地标、虚构名称等),您可以创建一个小型自定义字典检测器,并加入由这些会议室名称组成的列表。Sensitive Data Protection 可以扫描内容中是否包含每个房间名称,并在上下文中遇到其中一个房间名称时返回匹配项。如需详细了解敏感数据保护如何与字典字词和短语进行匹配,请参阅创建常规自定义字典检测器中的“字典匹配详情”部分。

如需详细了解小型自定义字典 infoType 检测器的工作原理及其实际应用示例,请参阅创建常规自定义字典检测器

大型自定义字典检测器

如果您要扫描大量的字词或短语,或者您的字词或短语列表经常变化,请使用大型自定义字典检测器(也称为“存储的自定义字典检测器”)。大型自定义字典检测器可以匹配多达数千万个字词或短语。

大型自定义字典检测器的创建方式与正则表达式自定义检测器和小型自定义字典检测器不同。每个大型自定义字典都由两部分组成:

  • 您创建和定义的短语列表。该列表以文本文件的形式存储在 Cloud Storage 中或以列的形式存储在 BigQuery 表中。
  • 生成的字典文件,由敏感数据保护功能根据您的短语列表构建。字典文件存储在 Cloud Storage 中,由源短语数据的副本和帮助进行搜索和匹配的布隆过滤器组成。您无法直接修改这些文件。

在创建字词列表并使用敏感数据保护生成自定义字典后,您可以像使用其他 infoType 检测器一样,使用大型自定义字典检测器启动或安排扫描。

如需详细了解大型自定义字典检测器的工作原理及其实际应用示例,请参阅创建存储的自定义字典检测器

正则表达式

借助正则表达式 (regex) 自定义 infoType 检测器,您可以创建自己的 infoType 检测器,使 Sensitive Data Protection 能够基于正则表达式模式检测匹配项。例如,假设您的医疗记录编号采用 ###-#-##### 形式。您可以定义一个正则表达式模式,如下所示:

[1-9]{3}-[1-9]{1}-[1-9]{5}

然后,Sensitive Data Protection 会匹配以下项:

123-4-56789

您还可以指定要分配给每个自定义 infoType 匹配项的可能性。也就是说,当敏感数据保护与您指定的序列匹配时,它将分配您指示的可能性。这很有用,因为如果您的自定义正则表达式定义了一个非常常见的序列,可能容易与其他一些随机序列匹配,您肯定不希望敏感数据保护功能将每个匹配项都标记为 VERY_LIKELY。这样做会降低扫描结果的置信度,还可能导致对错误信息进行匹配和去标识化。

如需详细了解正则表达式自定义 infoType 检测器及其实际应用,请参阅创建自定义正则表达式检测器

检查规则

您可以使用检查规则优化现有 infoType 检测器(内置或自定义)返回的结果。当需要以某种方式(无论是增添还是删减现有 infoType 检测器)增加敏感数据保护返回的结果时,则可以使用检查规则。

这两种检查规则是:

  • 排除规则
  • 热词规则

如需详细了解检查规则,请参阅修改 InfoType 检测器以优化扫描结果

排除规则

通过排除规则,您可以通过向内置或自定义 infoType 检测器添加规则来减少返回结果的数量或降低精确率。排除规则可以帮助减少 InfoType 检测器返回的噪声或其他不需要的结果。

例如,如果您要扫描数据库中的电子邮件地址,可以添加自定义正则表达式形式的排除规则,指示敏感数据保护功能排除以“@example.com”结尾的所有结果。

如需详细了解排除规则,请参阅修改 InfoType 检测器以优化扫描结果

热词规则

通过热词规则,您可以通过向内置或自定义 infoType 检测器添加规则来增加返回结果的数量或提高准确率。热词规则可以有效地帮助您放宽现有的 infoType 检测器规则。

例如,假设您要扫描医疗数据库中的患者姓名。您可以使用 Sensitive Data Protection 的内置 PERSON_NAME infoType 检测器,但这会导致 Sensitive Data Protection 匹配所有人名,而不仅仅是患者姓名。为解决此问题,您可以添加正则表达式自定义 infoType 形式的热词规则,用于在潜在匹配项第一个字符附近的一定字符范围内中查找“患者”一词。然后,您可以向匹配该模式的结果分配“极有可能”这一可能性,因为这些结果符合您的特殊标准。

如需详细了解热词规则,请参阅修改 InfoType 检测器以优化扫描结果

示例

如需更深入地了解 infoType 匹配结果的方式,请查看以下示例。这些示例会匹配一系列数字来确定其是美国社会保障号还是美国个人纳税人识别号。请注意,这些示例适用于内置 infoType 检测器。创建自定义 infoType 检测器时,请指定用于确定扫描匹配项可能性的条件。

示例 1

"SSN 222-22-2222"

针对 VERY_LIKELY 报告较高的可能性分数 US_SOCIAL_SECURITY_NUMBER,原因如下:

  • 采用的是标准的社会保障号格式,这提高了确定性。
  • 旁边有上下文(“SSN”),这提高了其为 US_SOCIAL_SECURITY_NUMBER 的确定性。

示例 2

"999-99-9999"

针对 US_SOCIAL_SECURITY_NUMBER 报告较低的可能性分数 VERY_UNLIKELY,原因如下:

  • 采用的是标准格式,这提高了确定性。
  • 以 9 开头 - 但社会保障号中不允许以 9 开头,因此降低了确定性。
  • 缺少上下文,这降低了确定性。

示例 3

"999-98-9999"

针对 US_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER 报告可能性分数 POSSIBLE,针对 US_SOCIAL_SECURITY_NUMBER 报告可能性分数 VERY_UNLIKELY,原因如下:

  • 具有 US_SOCIAL_SECURITY_NUMBERUS_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER 的标准格式。
  • 以 9 开头且有另一个校验位,这提高了其属于 US_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER 的确定性。
  • 缺少上下文,这降低了其属于两者的确定性。

后续步骤

敏感数据保护团队会定期发布新的 infoType 检测器和组。如需了解如何获取最新的内置 infoType 列表,请参阅列出内置 infoType 检测器