仮名化

コンセプト概要

仮名化(トークン化とも呼ばれます)は、機密データが一貫した方法でサロゲート(トークンとも呼ばれます)に置き換えられる匿名化手法です。これは、サロゲートが匿名化されたデータセット内で参照プロパティを保持するという点で、秘匿化や一般化などの他の匿名化手法とは大きく異なります。さらに、サロゲートを作成するためにどの変換が使用されるかに応じて、これらのサロゲートは、承認されたユーザーによって元の機密値に逆戻りする可能性があります。

変換の例

仮名化の有用性を理解するために、次の例について考えてみてください。

次のデータがあるとします。

従業員 ID 日付 報酬
11111 2015 10 ドル
11111 2016 20 ドル
22222 2016 15 ドル

外れ値である従業員を特定するために、従業員の報酬が時間の経過とともにどのように変化したかを確認します。外れ値を見つけたら、報酬の差を修正します。さらに、個人に対し機密性の高い報酬データを公開することなく、これを実行したいと考えています。

個人を特定する唯一の方法が「従業員 ID」であると仮定すると、この列を匿名化する必要があります。

次に、「従業員 ID」に仮名化変換を適用できます。仮名化変換には、CryptoHashConfigCryptoReplaceFfxFpeConfig という 2 つのオプションがあります。外れ値である実際の従業員を元に戻すことができるようにするためには、元に戻すための変換が必要です。これによって、選択内容を CryptoReplaceFfxFpeConfig に絞り込みます。

次に、変換を以下のように構成します。

"cryptoReplaceFfxFpeConfig": {
  "cryptoKey": {
    "unwrapped": {
      "key": "abcdefghijklmnop"
    }
  },
  "commonAlphabet": "NUMERIC"
}

次のように content.deidentify メソッドを使用して、この変換を「従業員 ID」に適用します。

JSON 入力:

POST https://dlp.googleapis.com/v2/projects/[PROJECT_ID]/content:deidentify?key={YOUR_API_KEY}

{
  "deidentifyConfig":{
    "recordTransformations":{
      "fieldTransformations":[
        {
          "primitiveTransformation":{
            "cryptoReplaceFfxFpeConfig":{
              "cryptoKey":{
                "unwrapped":{
                  "key":"YWJjZGVmZ2hpamtsbW5vcA=="
                }
              },
              "commonAlphabet":"NUMERIC"
            }
          },
          "fields":[
            {
              "name":"Employee ID"
            }
          ]
        }
      ]
    }
  },
  "item":{
    "table":{
      "headers":[
        {
          "name":"Employee ID"
        },
        {
          "name":"Date"
        },
        {
          "name":"Compensation"
        }
      ],
      "rows":[
        {
          "values":[
            {
              "stringValue":"11111"
            },
            {
              "stringValue":"2015"
            },
            {
              "stringValue":"$10"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"11111"
            },
            {
              "stringValue":"2016"
            },
            {
              "stringValue":"$20"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"22222"
            },
            {
              "stringValue":"2016"
            },
            {
              "stringValue":"$15"
            }
          ]
        }
      ]
    }
  }
}

JSON 出力:

{
  "item":{
    "table":{
      "headers":[
        {
          "name":"Employee ID"
        },
        {
          "name":"Date"
        },
        {
          "name":"Compensation"
        }
      ],
      "rows":[
        {
          "values":[
            {
              "stringValue":"28777"
            },
            {
              "stringValue":"2015"
            },
            {
              "stringValue":"$10"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"28777"
            },
            {
              "stringValue":"2016"
            },
            {
              "stringValue":"$20"
            }
          ]
        },
        {
          "values":[
            {
              "stringValue":"39344"
            },
            {
              "stringValue":"2016"
            },
            {
              "stringValue":"$15"
            }
          ]
        }
      ]
    }
  },
  "overview":{
    "transformedBytes":"15",
    "transformationSummaries":[
      {
        "field":{
          "name":"Employee ID"
        },
        "results":[
          {
            "count":"3",
            "code":"SUCCESS"
          }
        ],
        "fieldTransformations":[
          {
            "fields":[
              {
                "name":"Employee ID"
              }
            ],
            "primitiveTransformation":{
              "cryptoReplaceFfxFpeConfig":{
                "cryptoKey":{
                  "unwrapped":{
                    "key":"YWJjZGVmZ2hpamtsbW5vcA=="
                  }
                },
                "commonAlphabet":"NUMERIC"
              }
            }
          }
        ],
        "transformedBytes":"15"
      }
    ]
  }
}

変換後の表は次のとおりです。

従業員 ID 日付 報酬
28777 2015 $10
28777 2016 $20
39344 2016 15 ドル

この変換では、従業員に属しているレコードがリンクされたまま、実際の従業員 ID を削除し同一の ID を一貫して置き換えることによって、ニーズに合わせることができます。たとえば、従業員 ID「11111」は、最初の 2 つのレコードで一貫して「28777」に置き換えられます。取得したデータの値は、プライバシーを保持しながら、分析のために保存されます。

元に戻す例

元に戻すことを説明するために、前の例を使用します。分析で ID「28777」の従業員がより高い賃金を支払われるべきであると判断された場合、データの所有者(おそらく会社の管理者)はその従業員の報酬を調整したいと考えます。これを行うには、実際の従業員 ID が必要になります。「28777」を実際の ID に戻すには、content.reidentify メソッドを次の JSON の例のように使用します。

JSON 入力:

POST https://dlp.googleapis.com/v2/projects/[PROJECT_ID]/content:reidentify?key={YOUR_API_KEY}

{
  "reidentifyConfig":{
    "recordTransformations":{
      "fieldTransformations":[
        {
          "primitiveTransformation":{
            "cryptoReplaceFfxFpeConfig":{
              "cryptoKey":{
                "unwrapped":{
                  "key":"YWJjZGVmZ2hpamtsbW5vcA=="
                }
              },
              "commonAlphabet":"NUMERIC"
            }
          },
          "fields":[
            {
              "name":"Employee ID"
            }
          ]
        }
      ]
    }
  },
  "item":{
    "table":{
      "headers":[
        {
          "name":"Employee ID"
        }
      ],
      "rows":[
        {
          "values":[
            {
              "stringValue":"28777"
            }
          ]
        }
      ]
    }
  }
}

JSON 出力:

{
  "item":{
    "table":{
      "headers":[
        {
          "name":"Employee ID"
        }
      ],
      "rows":[
        {
          "values":[
            {
              "stringValue":"11111"
            }
          ]
        }
      ]
    }
  },
  "overview":{
    "transformedBytes":"5",
    "transformationSummaries":[
      {
        "field":{
          "name":"Employee ID"
        },
        "results":[
          {
            "count":"1",
            "code":"SUCCESS"
          }
        ],
        "fieldTransformations":[
          {
            "fields":[
              {
                "name":"Employee ID"
              }
            ],
            "primitiveTransformation":{
              "cryptoReplaceFfxFpeConfig":{
                "cryptoKey":{
                  "unwrapped":{
                    "key":"YWJjZGVmZ2hpamtsbW5vcA=="
                  }
                },
                "commonAlphabet":"NUMERIC"
              }
            }
          }
        ],
        "transformedBytes":"5"
      }
    ]
  }
}

JSON 出力に示されているように、実際の従業員 ID「11111」が返されます。

コンテキスト

CryptoReplaceFfxFpeConfig などの仮名化変換を使用して構造化データ(レコードとフィールドが含まれる表形式のデータ)を変換する場合、context を指定できます。これを指定すると、context では、特定のレコードの値が「調整」として使用されるフィールドを定義します。たとえば、以下の表では、「患者 ID」をコンテキストとして選択できます。この場合、最初のレコードでは「4672」、2 番目のレコードでは「3246」などとなります。

コンテキストを指定する目的を理解するために、まず、下の表の「名前」フィールドがコンテキストを使用せずに変換されている想定します。この場合、同一の名前が同じトークンに置き換えられます。これは、2 つの一致するトークンが同じ名前を参照することを意味します。ただし、これによってレコード間の機密性の高い関係を明らかになる可能性があるため、望ましくない可能性があります。ここでは、コンテキストを利用してこれらの関係を解消することができます。この場合、これらの関係は、同じ調整を使用して生成されたトークンに対してのみ保持されます。

たとえば、次の表を検討してください。

請求番号 患者 ID 名前
223 4672 John  
224 3246 Debra  
225 3529 Nate  
226 4098 Debra  
     

コンテキストを指定せずにこの変換を「名前」に適用すると、次の変換表が生成されます(正確なトークン値は、指定された cryptoKey に応じて異なります)。

請求番号 患者 ID 名前
223 4672 gCUv  
224 3246 Eusyv  
225 3529 dsla  
226 4098 Eusyv  
     

上記の表では、名前「Debra」のレコードのトークンは同じです。この関係を解消するために、コンテキストとして「患者 ID」を指定し、元のテーブルへの変換を実行することができます。これにより、次の変換表が生成されます(正確なトークン値は、指定された cryptoKey に応じて異なります)。

請求番号 患者 ID 名前
223 4672 Agca  
224 3246 vSHig  
225 3529 kqHX  
226 4098 CUgv  
     

2 つのレコード間で「患者 ID」が異なるため、「Debra」を異なるトークンに置き換える方法に注意してください。

サロゲートのアノテーション

上記の例では、構造化された(表形式の)データが使用されています。これによって、元に戻されたトークンを容易に特定できるため、簡単に元に戻すことができます。ただし、自由形式のテキストにトークンが存在している場合、元に戻すには、まずトークンの位置を特定する必要があります。元に戻すことが可能な変換では、surrogateInfoType フィールドを使用してこれを行います。詳細については、CryptoReplaceFfxFpeConfig をご覧ください。

このフィールドはカスタム情報タイプ SurrogateType と連携して、トークンの自由形式のテキストの検査を容易にします。

自由形式のテキストコードでの匿名化の例

次に例を示します。content.deidentify メソッドを使用し、トークンを使用して自由形式のテキストで検出された電話番号を変換します。

JSON 入力:

POST https://dlp.googleapis.com/v2/projects/velvety-study-196101/content:deidentify?key={YOUR_API_KEY}

{
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"PHONE_NUMBER"
            }
          ],
          "primitiveTransformation":{
            "cryptoReplaceFfxFpeConfig":{
              "cryptoKey":{
                "unwrapped":{
                  "key":"YWJjZGVmZ2hpamtsbW5vcA=="
                }
              },
              "commonAlphabet":"NUMERIC",
              "surrogateInfoType":{
                "name":"PHONE_TOKEN"
              }
            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"PHONE_NUMBER"
      }
    ],
    "minLikelihood":"UNLIKELY"
  },
  "item":{
    "value":"My phone number is 4359916732"
  }
}

JSON が指定された URL に送信されると、Cloud DLP は次の出力を返します。

JSON 出力:

{
 "item": {
  "value": "My phone number is PHONE_TOKEN(10):9617256398"
 },
 "overview": {
  "transformedBytes": "10",
  "transformationSummaries": [
   {
    "infoType": {
     "name": "PHONE_NUMBER"
    },
    "transformation": {
     "cryptoReplaceFfxFpeConfig": {
      "cryptoKey": {
       "unwrapped": {
        "key": "YWJjZGVmZ2hpamtsbW5vcA=="
       }
      },
      "commonAlphabet": "NUMERIC",
      "surrogateInfoType": {
       "name": "PHONE_TOKEN"
      }
     }
    },
    "results": [
     {
      "count": "1",
      "code": "SUCCESS"
     }
    ],
    "transformedBytes": "10"
   }
  ]
 }
}

Cloud DLP は、電話番号(9617256398)を正常に匿名化しています。

自由形式のテキストコードでの再識別の例

この 2 番目の例では、content.reidentify メソッドを使用して、最初の例で変換されたテキストを元の番号に戻します。

JSON 入力:

POST https://dlp.googleapis.com/v2/projects/[PROJECT_ID]/content:reidentify?key={YOUR_API_KEY}

{
 "reidentifyConfig": {
  "infoTypeTransformations": {
   "transformations": [
    {
     "infoTypes": [
      {
       "name": "PHONE_TOKEN"
      }
     ],
     "primitiveTransformation": {
      "cryptoReplaceFfxFpeConfig": {
       "cryptoKey": {
        "unwrapped": {
         "key": "YWJjZGVmZ2hpamtsbW5vcA=="
        }
       },
       "commonAlphabet": "NUMERIC",
       "surrogateInfoType": {
        "name": "PHONE_TOKEN"
       }
      }
     }
    }
   ]
  }
 },
 "inspectConfig": {
  "customInfoTypes": [
   {
    "infoType": {
     "name": "PHONE_TOKEN"
    },
    "surrogateType": {
    }
   }
  ]
 },
 "item": {
  "value": "My phone number is PHONE_TOKEN(10):9617256398"
 }
}

JSON 出力:

{
  "item":{
    "value":"My phone number is 4359916732"
  },
  "overview":{
    "transformedBytes":"26",
    "transformationSummaries":[
      {
        "infoType":{
          "name":"PHONE_TOKEN"
        },
        "transformation":{
          "cryptoReplaceFfxFpeConfig":{
            "cryptoKey":{
              "unwrapped":{
                "key":"YWJjZGVmZ2hpamtsbW5vcA=="
              }
            },
            "commonAlphabet":"NUMERIC",
            "surrogateInfoType":{
              "name":"PHONE_TOKEN"
            }
          }
        },
        "results":[
          {
            "count":"1",
            "code":"SUCCESS"
          }
        ],
        "transformedBytes":"26"
      }
    ]
  }
}

Cloud DLP は、電話番号(4359916732)を正常に再識別しています。

リソース

Cloud DLP での機密データの仮名化、匿名化、再識別の詳細については、テキスト コンテンツ内の機密データの匿名化をご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Data Loss Prevention