14.2 Pseudonymisation、匿名化与链接攻击:删除姓名远远不够
去掉直接标识符通常只是 pseudonymisation 或去标识化步骤,不自动产生匿名数据。是否可识别取决于数据、接收者、可用辅助信息和合理可行的攻击。
本课目标
- 区分直接标识、间接标识、singling out、linkability 与 inference;
- 理解 masking、tokenisation、加密、泛化和聚合的边界;
- 评估散列、映射表和外部链接风险;
- 为数据发布设计攻击测试和持续复审。
1. 识别不要求知道姓名
如果一条记录能稳定区分同一个人,或能影响一个具体的人,即使不知道真实姓名,也可能存在识别风险。
攻击目标包括:
- singling out:从群体中隔离某个人的记录;
- linkability:把同一人的多个记录/数据集连接;
- inference:从已知信息推断敏感属性;
- re-identification:把记录关联回现实身份。
精确时间、位置、年龄、罕见事件和轨迹组合常比单列更危险。
2. Pseudonymisation 与匿名化
Pseudonymisation 把直接身份与分析数据分开,额外信息可使其重新关联。例如随机 token 与独立保管的映射表。它能减少暴露和控制链接,却通常仍应按个人数据保护。
匿名化要求在具体发布环境下,人不再可合理识别。公开发布、受控研究室和组织内部使用面对的攻击者、辅助数据和控制不同,匿名判断也不同。
不要把“匿名”当一次性标签。新公开数据、计算能力、接收者变化和数据积累会改变识别风险,需要定期复审。
术语还应标明适用制度。GDPR 第 4(5) 条定义假名化,序言第 26 段强调合理可用的识别手段;去掉姓名并不能自动得出匿名结论。技术与治理评估可参看 NIST SP 800-188,法律判断仍依据具体处理环境。
3. 技术分别解决什么
Masking
ali***@example.com 仍可能直接指向个人,适合界面最少展示,不是匿名化。
Tokenisation
用随机 token 替换标识,映射表分离、加密并严格授权。随机 token 不暴露原标识的数学关系,但映射表泄露会恢复身份。
Keyed pseudonym
需要确定性 join 时,可用受密钥保护的 MAC/HMAC 方案并隔离密钥。不要对小而可枚举的编号直接做无密钥 hash;攻击者能离线猜测。密钥轮换、作用域和跨数据集链接策略要设计。
Encryption
保护静态或传输数据,授权解密后仍是原始个人数据。确定性加密还会泄露相等模式。
Generalisation / suppression
把年龄改成区间、位置改成区域、删除稀有记录,降低细粒度链接,但会损失分析效用且不保证无法识别。
Aggregation
只发布群体统计可减少行级暴露;小单元、差分查询和多个交叉表仍可能泄露。
4. 为什么截断 SHA-256 不是 tokenisation
把 sha256(user_id).hexdigest()[:16] 称为“不可逆 token”会忽略以下问题:
- 用户 ID 域可能很小,可被穷举;
- 相同输入跨表产生相同值,扩大链接;
- 截断增加碰撞概率;
- 没有密钥和隔离边界;
- 原列删除不影响其他准标识符;
- 无法按主体安全地轮换或撤销映射。
不可从摘要直接求原文,不等于攻击者不能猜中原文。方案必须从攻击模型和链接需求出发。
下面只使用 1,000 个合成编号做候选比对,没有破解 SHA-256。之后用标准库 HMAC 演示作用域隔离,密钥为本次新生成的临时值:
import hashlib
import hmac
import secrets
candidates = [f"synthetic-user-{i:03d}" for i in range(1000)]
target = "synthetic-user-042"
def short_hash(value):
return hashlib.sha256(value.encode()).hexdigest()[:16]
lookup = {short_hash(value): value for value in candidates}
assert lookup[short_hash(target)] == target
print(lookup[short_hash(target)])
# synthetic-user-042
key = secrets.token_bytes(32)
def scoped_pseudonym(scope, identifier):
message = scope.encode() + b"\x00" + identifier.encode()
return hmac.new(key, message, hashlib.sha256).hexdigest()
assert scoped_pseudonym("study-a", target) == scoped_pseudonym("study-a", target)
assert scoped_pseudonym("study-a", target) != scoped_pseudonym("study-b", target)16 个十六进制字符只有 64 位。HMAC 保留同一作用域内的相等关系,不能隐藏其他准标识符;拥有密钥或可批量调用映射接口的人仍可测试候选 ID。生产中需受控密钥管理、版本和访问限制,不要把临时密钥代码直接当密钥服务。这里 scope 与 ID 都限定为不含空字节的文本,其他输入应使用无歧义编码。接口见 Python hmac。
5. k-anonymity 等模型的边界
k-anonymity 试图让每种准标识符组合至少有 k 条记录。它可帮助发现唯一组合,但:
- 同组敏感值相同会发生属性披露;
- 攻击者的背景知识仍可缩小范围;
- 高维数据会迫使大量泛化;
- 它不管理多次发布和组合查询;
- k 的选择没有脱离场景的万能值。
l-diversity、t-closeness 等扩展缓解部分问题,但仍依赖准标识符和攻击假设。需要针对具体接收者与发布方式评估。
下面三行代表三个不同的合成人员。以年龄段和区域为准标识符时满足 k=3,但处分标记只有一种:
from collections import defaultdict
rows = [
{"age_band": "30-39", "region": "north", "disciplinary_flag": True},
{"age_band": "30-39", "region": "north", "disciplinary_flag": True},
{"age_band": "30-39", "region": "north", "disciplinary_flag": True},
]
groups = defaultdict(list)
for row in rows:
groups[(row["age_band"], row["region"])].append(row["disciplinary_flag"])
print([(len(values), len(set(values))) for values in groups.values()])
# [(3, 1)]若攻击者知道某人属于这组三行,即使不能判断是哪一行,也能推断其标记。这说明不能把“有三条相同准标识符”直接写成“三分之一泄露概率”。
6. 合成数据也可能记住个人
合成数据可减少直接复制,但生成模型可能记忆训练样本,稀有记录或条件查询仍可能泄露。验证:
- 与训练记录的最近邻和重复;
- membership/attribute inference 风险;
- 稀有群体与极端值;
- 下游效用和群体偏差;
- 生成方法是否提供可证明隐私保证。
“synthetic”描述生成方式,不是隐私等级。
最近邻或成员推断测试通过,只说明所测攻击未成功,不构成数学隐私证明。若生成机制采用 DP,也必须按实际训练过程、贡献界限和预算核对;公开发布后通常无法收回所有副本,撤回控制能力应如实记录。
7. 发布环境决定控制强度
公开发布
公开下载后无法控制接收者与后续链接。应在发布前降低粒度或应用经验证的隐私机制;若需要限制查询,应保留数据、改由受控接口提供结果,而不是下载后再指望接口限制生效。
受控共享
可结合合同、身份、隔离环境、输出检查、禁止链接、审计和销毁证明。组织控制降低风险,但不能替代技术最小化。
内部使用
内部人员、日志复制和权限扩散仍是威胁。pseudonym mapping 应由不同职责控制,分析环境默认不提供重识别路径。
8. 重识别风险评估
1. 明确发布数据、接收者和允许用途
2. 列出直接/间接标识与推断属性
3. 盘点合理可得辅助数据和攻击能力
4. 测试 singling out、linkability、inference
5. 应用变换与组织控制
6. 重新测量效用、群体影响和残余风险
7. 独立复核并记录发布决定
8. 监控环境变化、撤回与到期受控重识别测试需要明确授权和安全环境;不要把真实数据交给无授权“红队”尝试。
常见误区
- 删除姓名就是匿名:轨迹和准标识符仍可能识别。
- hash 是不可逆的,所以安全:可枚举输入可被字典攻击。
- 内部数据无需匿名风险评估:内部链接能力往往更强。
- 合成数据天然不含个人信息:模型可能复制或泄露训练样本。
练习
- 对一份轨迹表列出 singling out、linkability 和 inference 攻击。
- 比较无密钥 hash、HMAC 和随机 token 的链接与密钥风险。
- 对 k-anonymous 表构造同质性攻击。
- 为公开发布和受控研究环境分别设计控制,并解释差异。
小结
去标识化是风险降低过程,不是删除几列后的永久标签。技术是否有效,要结合接收者、辅助信息、链接目的和持续变化的攻击环境判断。
下一课介绍一种不同的思路:差分隐私不试图隐藏每行外观,而是限制一个人的加入或离开对发布结果分布的影响。