Day 11 實測 DLP 自訂 infoType 只能做 regex。[A-Z][12]\d{8} 這個模式在真實文本裡會命中什麼?工單編號、料號、某些銀行的交易序號——格式相同、實際不是身分證的字串到處都是。沒有 checksum,PII 偵測的誤判率會高到業務單位受不了。
這也是本系列 PII 的最後一天。再往下的去識別化策略、可控還原、特種個資語意層,請看《30 天為金融法務部門打造 LLM 個資防護閘》。
格式:一個英文字母 + 一位性別碼(1/2,另有外來人口的 8/9)+ 八位數字。
字母對應數字(A=10、B=11 … 但 I、O 等跳號),取十位與個位分別加權:
# checks/checksum.py
LETTER = {c: v for c, v in zip("ABCDEFGHJKLMNPQRSTUVXYWZIO",
[10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29,30,31,32,33,34,35])}
WEIGHTS = [1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1]
def tw_national_id(s: str) -> bool:
if len(s) != 10 or s[0] not in LETTER or s[1] not in "12":
return False
if not s[2:].isdigit():
return False
n = LETTER[s[0]]
digits = [n // 10, n % 10] + [int(c) for c in s[1:]]
return sum(d * w for d, w in zip(digits, WEIGHTS)) % 10 == 0
【作者確認】字母對應表與新式外來人口統一證號(第二碼 8/9)的規則請對照內政部現行公告。
八位數字,加權 1,2,1,2,1,2,4,1,各乘積的十位與個位相加後總和檢查。2023 年起規則放寬(由 mod 10 改為 mod 5),實作要用新規則,否則會漏掉新核發的統編。
def tw_ubn(s: str) -> bool:
if len(s) != 8 or not s.isdigit():
return False
w = [1, 2, 1, 2, 1, 2, 4, 1]
total = 0
for d, k in zip(map(int, s), w):
p = d * k
total += p // 10 + p % 10
if total % 5 == 0:
return True
# 第七位為 7 時的特例
return s[6] == "7" and (total + 1) % 5 == 0
【作者確認】mod 5 新規則與第七位為 7 的特例,請對照財政部現行公告。
十二位數字,前四碼固定 0000。沒有公開的 checksum 演算法——這一項 L1 只能做格式比對,誤判率會比另外兩項高。實務上要搭配 hotword(前後 20 字內出現「健保」「卡號」)提升信心,否則任何 0000 開頭的十二位數字都會命中。
- id: PII-TW-NHI
pattern: "0000\\d{8}"
hotwords: ["健保", "卡號", "NHI"]
hotword_window: 20
action: mask
confidence_without_hotword: low # 無 hotword 時只 tag,不 mask
09\d{8},無 checksum,同樣用 hotword 提升信心。L1 命中 PII 之後,mask 的具體做法要跟輸入端/輸出端分開(Day 11 講過的原則):
| 端 | 動作 | 遮罩形式 |
|---|---|---|
| 輸入端 | 依應用決定:tag 或 mask | 模型需要看到真實值的任務不能 mask |
| 輸出端 | mask | 保留型別與部分字元:A12****789,讓使用者知道這裡原本有個身分證 |
保留型別的遮罩比整段拿掉好,因為它讓下游(人或程式)知道發生了什麼。
絕對不用真實個資測試。 三種型別的合成資料都要通過 checksum(用生成器產生合法值),再混進正常文本:
def gen_tw_id():
while True:
s = random.choice(list(LETTER)) + random.choice("12") + \
"".join(random.choices("0123456789", k=8))
if tw_national_id(s):
return s
拿業務語料(含大量工單號、料號、交易序號)跑兩次:只用 regex、regex + checksum。
Day 17:Guard model 選型。ShieldGemma、Nemotron Safety Guard、Qwen3Guard、Prompt Guard——各自的設計目標、授權、語言覆蓋,以及金融業採購時繞不開的產地與內容政策問題。
Instagram @aid3fend。掃 QR code 或點連結追蹤,有問題也歡迎直接私訊討論。
更多 AI 資安筆記:aid3fend.com