匿名化

概念總覽

匿名化 (又稱為代碼化) 是一種去識別化技術,可使機密資料一律由代理值 (又稱為代碼) 取而代之。這與遮蓋或一般化等其他的去識別化技術不同,代理值會在去識別化的資料集中保留其參考屬性。此外,根據用於產生代理值的轉換而定,授權使用者可能可以將這些代理值反轉回原本的機密值。

轉換範例

為了瞭解匿名化的實用性為何,請參考以下範例。

假設我們有以下資料:

員工 ID 日期 薪酬
11111 2015 $10 美元
11111 2016 $20 美元
22222 2016 $15 美元

假設我們想知道員工的薪酬在某段時間的變化,以找出屬於離群值的員工。找到離群值後,我們要更正所得差距。不只如此,還必須在不暴露任何個人機密的薪酬資料情況下進行。

假設只能依據「員工 ID」來識別一個人的身分,那麼就必須對這個資料欄做去識別化處理。

接著,我們可以將匿名化轉換套用到「員工 ID」。請考慮使用兩個匿名化轉換選項:CryptoHashConfigCryptoReplaceFfxFpeConfig。由於我們希望可以找到屬於離群值的實際員工,所以需要可反轉的轉換。因此選擇限縮為 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」已一致換成「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」,第二筆記錄則為「3246」,依此類推。

為瞭解指定結構定義的目的,首先假設下表中的「名字」欄位在不使用結構定義情況下進行轉換。在這種情況下,所有相同的名字就會替換成相同的代碼。言下之意就是,兩個相符的代碼指的是同一個名字。但這可能不是我們想要的情況,因為記錄間的機密關係可能有洩漏之虞。此時,我們可以利用結構定義來打破這些關係,藉此,只有使用相同修正項目產生的代碼,才會維繫這些關係。

例如,請看下表的例子。

帳單編號 患者 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  
     

注意現在「Debra」已經換成不同的代碼,這是因為兩筆記錄的「患者 ID」不同所致。

代理值註解

上面的範例使用了結構化 (表格式) 資料,所以反轉就容易了,因為要進行反轉的代碼可以輕易識別出來。不過,在任意文字中存在代碼時,執行反轉將需要先找到該代碼。可反轉的轉換透過 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 傳送到指定網址後,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)。

在任意文字中進行重新識別的程式碼範例

在第二個範例中,我們使用 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 將機密資料匿名化、去識別化和重新識別,請參閱將文字內容中的機密資料去識別化一文。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
資料遺失防護說明文件