记录一下那天晚上的排查过程。用户表删了 name 和 phone 就认为脱敏完成,结果邮编加出生日期在 3 万条数据里能唯一定位到 12 个人,评测数据外发被安全团队拦下。
刚开始盯着「时间精度到天,细粒度太高」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。准标识组合仍然具备唯一性。少数情况下是邮编和生日都没有做泛化。
还有一种情况,小样本组没有做抑制。
算准标识组合的唯一组数量
python -c "import pandas as pd;d=pd.read_csv('users.csv');print(d.groupby(['zip','birth']).size().value_counts().head())"
然后把邮编截断到前三位
python -c "print('310101'[:3]+'00')"
生日泛化到年份
python -c "import pandas as pd;d=pd.read_csv('users.csv');print(pd.to_datetime(d['birth']).dt.year.head())"
等前面都确认过,再对小于 5 条的组做抑制再发布
python -c "import pandas as pd;d=pd.read_csv('users.csv');g=d.groupby(['zip','birth']).size();print((g<5).sum())"
改完先别撤,确认这几项。泛化后最小分组大小是 7,唯一组数量为 0,重识别风险测试通过,安全团队放行外发。
补一句。脱敏不是删掉姓名就完事,邮编、生日、性别这种准标识组合起来往往比姓名更能定位到人。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
