🛡️ 第七章 与安全相关的法律和制度
📄 一句话概括

数据放在自己手里只是【持有】,一旦要拿出去用、给出去、或者加工之后发布出去,就必须回答同一个问题:这一步凭什么做——Opt-in 要先去要同意,Opt-out 要先备案后通知,k-匿名化则要能证明【认不出是谁】。

📝 本节和前面几节的关系

7-1 讲的是【这些数据分别属于哪一层】,本篇讲的是层分好之后的下一步:能怎么动它。 合法持有的数据,不等于可以随意使用。 这是很多人第一次做合规时最不适应的一点——收集时拿到的授权,通常只覆盖收集时说明的那个目的。 它和 6-6 是一组对照:PCI DSS 管的是【卡号能不能存在这儿】,本篇管的是【数据能不能给出去】——前者是行业规则,后者是法律义务,两者经常在同一套系统里同时生效。

一、先分清两件事:谁先动、通知在哪一步

第三方提供的两条路,差别不在【有没有告知】,而在【动作的先后顺序】:

方式 谁先动 前提条件 2026 修正后的变化
Opt-in 先取得本人同意 无(同意本身即授权) 无变化
Opt-out 先提供、后通知 向监管机构备案+通知本人 须确认接收方身份与利用目的
特定生物识别信息 只能走 Opt-in 2026 修正新增的个人信息类别 禁止用 Opt-out 提供

Opt-out 常被误解成【不用同意】,这是错的。 它省掉的不是义务,而是顺序:你必须事先向监管机构备案(等于把这件事公开登记),并且在提供时通知本人。备案+通知这两件事一件不做,这条路当场走不通。

一句话记法:

二、七种做法各自走哪条路

下面的 Demo 把常见的七种做法逐一判定:

# 节选自本节 Demo 脚本 d2():七种做法的路径判定
for a, b, c in [
    ("注册页上勾选【同意向合作方提供】", "Opt-in", "明确同意"),
    ("隐私政策里说明并备案、逐次通知本人", "Opt-out", "备案+通知,本人可喊停"),
    ("把健康数据提供给保险公司", "只能 Opt-in", "要保护的个人信息"),
    ("把人脸特征数据提供给分析公司", "禁止提供", "2026 起禁止走 Opt-out"),
    ("只用于统计作成(含 AI 训练)", "无需同意", "2026 新增例外"),
    ("提供【已匿名加工】的数据", "不属于提供", "无法识别到人"),
    ("本人喊停后仍继续提供", "违法", "通知后必须停止"),
]:
    print("  " + pad(a, 50) + pad(b, 14) + c)

实跑输出:

==================================================================================================
二、七种做法各自走哪条路
==================================================================================================
  做法                                              判定          依据
  注册页上勾选【同意向合作方提供】                  Opt-in        明确同意
  隐私政策里说明并备案、逐次通知本人                Opt-out       备案+通知,本人可喊停
  把健康数据提供给保险公司                          只能 Opt-in   要保护的个人信息
  把人脸特征数据提供给分析公司                      禁止提供      2026 起禁止走 Opt-out
  只用于统计作成(含 AI 训练)                      无需同意      2026 新增例外
  提供【已匿名加工】的数据                          不属于提供    无法识别到人
  本人喊停后仍继续提供                              违法          通知后必须停止

  最后一条最值得记:Opt-out 的【out】一旦生效,前面所有授权都不作数。

读这个输出:

三、动手 Demo:拿六条记录手工做一遍 k-匿名化

k-匿名化要回答的问题很朴素:能不能做到【每个人至少和 k 个人长得一样】。下面的 Demo 用六条小记录把这件事从头做一遍。

# 节选自本节 Demo 脚本 d2():k-匿名化的三步泛化与一次抑制
K = 2   # 目标:每条记录至少与另 1 条不可区分
step1 = [(d[1], d[2][:3], d[3]) for d in data]              # 原始:年龄、邮编前 3 位、性别
step2 = [("%d0~%d9" % (d[1] // 10, d[1] // 10), d[2][:3], d[3]) for d in data]   # 年龄改十岁区间
step3 = [(("20~39" if d[1] < 40 else "40~59"), d[2][:2], d[3]) for d in data]     # 年龄改二十岁区间、邮编前 2 位
g1, bad1 = check(step1)
g2, bad2 = check(step2)
g3, bad3 = check(step3)

实跑输出:

==================================================================================================
三、k-匿名化:拿六条记录手工做一遍
==================================================================================================
  准标识符=(年龄, 邮编前 3 位, 性别);目标 k = 2

  编号    年龄    邮编前 3 位   性别    疾病
  A1      23      100-0001      男      流感
  A2      23      100-0002      男      流感
  A3      45      220-0011      女      糖尿病
  A4      45      220-0012      女      糖尿病
  A5      38      150-0001      男      骨折
  A6      52      150-0002      女      高血压

  第 1 步 原始数据:组数 4,满足 k=2 的组 2 个,不满足的组 2 个(涉及 2 条记录)
  第 2 步 年龄改十岁区间、邮编前 3 位:不满足的组仍有 2 个
  第 3 步 年龄改二十岁区间、邮编前 2 位:不满足的组仍有 2 个

  第 1 步不满足的那两组:
    年龄 38 | 邮编 150 | 男   只有 1 条记录
    年龄 52 | 邮编 150 | 女   只有 1 条记录

  → A5 与 A6 天生就是【唯一的两个人】:
    不同的年龄、不同的性别,邮编只差最后一位。
    再泛化下去只能把年龄和性别全抹掉 —— 那时数据也不再是数据了。

  正解是抑制(把这两条去掉):剩 4 条全部满足 k=2,代价是数据少了三分之一。

  最后看一眼 k-匿名化挡不住的东西 —— 组内同质性:
    {A1, A2} 同组,两人都是流感;{A3, A4} 同组,两人都是糖尿病。
    k 只管住了【分不清谁是谁】,管不住【这一组得的是什么病】。
    知道某个人落在这组里,就等于知道了他的病。

读这个输出:

四、⚠️ 2026 现状

30 秒实验

今天做两个动作,各 15 秒:

  1. 打开手机【设置】里的隐私或广告选项,找【个性化广告】的开关。 默认打开、需要你手动关掉的,就是 Opt-out 的形态;默认关闭、需要你主动勾选的,才是 Opt-in。
  2. 点开一个 App 的权限页面,看有没有【仅在使用中允许】这一项。 这个中间档的意义是:把【同意】从一个开关变成了一个范围——这正是 2026 年监管在推的方向:不是不让你用,而是要让同意的范围与用途对得上。

这一节要带走的一句是:同意的价值不在【签过字】,而在【同意的那件事和实际做的那件事是一条】——用途一变,原来的同意就作废了。

常见误区

  1. 错误:我们在隐私政策里写了可能向第三方提供,所以就算 Opt-out 合规了。——纠正:写进隐私政策只是【告知】的形态之一,Opt-out 还额外要求【向监管机构备案】和【在提供时通知本人】。这两件事都不是文字工作,是流程工作——备案要有受理记录,通知要有发送记录,本人喊停要有处理时限。判断标准:如果监管问你【这个人有没有被通知过】,你能不能在 5 分钟内调出证据。

  2. 错误:数据只要做过匿名处理,就可以自由使用和发布了。——纠正:匿名化的成立条件是【无法再识别到个人】,而这是一个会随时间变化的结论。两种最常见的翻车方式:① 只删了姓名和电话,但留着邮编+生日+性别(这三项的组合足以锁定相当一部分人);② 内容处理干净了,但元数据(设备号、拍摄时间、机构名)把来源暴露了。正确做法是把匿名化当成一次风险评估而不是一次技术操作:要写清楚【针对什么对手、在什么条件下、判断不能再识别】,并定期重估。

  3. 错误:k-匿名化的 k 值定得越大越安全,干脆定 100。——纠正:k 值定得越大,需要泛化掉的维度越多,数据越没用。这个 Demo 已经演示了这个代价:六条记录为了满足 k=2 就要删掉两条。k=100 意味着任何一组准标识符组合都要有 100 条记录——现实中只有极粗的划分才能做到,那样的数据几乎失去了分析价值。合理做法是先问【这份数据要回答什么问题】,再定【最小可接受的 k】;而且别忘了 k 之外还有同质性攻击要处理——这也是为什么实践里常常直接跳到差分隐私或合成数据。

  4. 错误:差分隐私就是加噪声,随便加一点就行。——纠正:噪声加多少不是随便定的,它由一个【隐私预算】控制,而这个预算是有限的。预算小的好处是保护强,代价是结果不准;更关键的一点是——每查一次就消耗一部分预算,用完就不能再查了。这解释了一个很常见的现象:为什么同一份差分隐私数据,第一次查询和第一万次查询的可信度完全不同。 所以差分隐私不是【给数据加个噪声】的功能,而是一套【限制能问几次】的制度。

自测三问(点开对答案) 1. Opt-in 与 Opt-out 的差别到底在哪一步? —— **差别在【顺序】,不在【要不要征求本人意见】**。Opt-in 是提供之前先拿到同意,本人不同意就什么都不发生;**Opt-out 是提供方先动,然后把这件事登记备案、通知本人,并接受本人随时叫停**。**代价结构完全不同**:Opt-in 的风险是**转化率低**(同意要主动勾选),Opt-out 的风险是**一旦流程漏一环就是违法**(没备案、没通知、喊停没停)。**所以选择不是【哪个省事】,而是【哪种成本更可控】**:**面向上百万用户的消费类业务通常走 Opt-in(因为量大到没法逐个通知),小规模的、有明确业务关系的场景才可能用 Opt-out。** 2. 为什么这个 Demo 里,泛化做了三步还是有一组不满足 k=2? —— **因为那两条记录在保留的维度上本来就独一无二**:A5 是 38 岁男性、A6 是 52 岁女性,邮编又都集中在一个很窄的区间。**泛化只能把【相邻】的值合并到一起,没法让本来就分属两端的两个人变得相像**。**这揭示了一个容易被忽略的事实:匿名化的难点不在【大多数记录】,而在一小撮【离群的记录】**——它们往往正是最有分析价值的那几条(**罕见病例、极端值**)。**所以现实里的处理顺序通常是:先抑制离群记录,再对剩余数据做泛化**;**而抑制掉的那部分,恰恰是数据利用率损失的主要来源。** 3. 【k-匿名化挡不住同质性攻击】这句话的实际含义是什么? —— **它的意思是:k-匿名化只保证了【在一组里分不出谁是谁】,没有保证【这一组的敏感属性有变化】**。Demo 里 {A1, A2} 两人同组、两人都是流感——**对攻击者来说,先通过外部信息把人锁定到这一组(这一步往往不难),然后就直接读到答案**,**根本不需要再分清是 A1 还是 A2**。**这类攻击在医疗数据上尤其致命**,因为医院科室+年龄+地区这种组合本身就和疾病高度相关。**补法是要求每组内的敏感属性至少有 l 种不同取值(l-多样性),或者要求分布接近总体分布(t-接近性)**;**但这些方法在更高维的数据上仍会失效**——**这也是这条技术路线最终转向差分隐私的原因。**

相关笔记