社区一年一度的「百家宴」到了。王阿姨有祖传的红烧肉配方,李叔腌得一手好泡菜,小陈做蛋糕从不外传——人人都有一道独门菜,人人都想尝到整条街的味道,但没谁愿意交出配方。于是大家想了个主意:每人把菜浓缩成一勺「精华汤底」,倒进一口大锅里搅匀,做成一锅集百家之长的「百味汤」。可问题是:掌勺的帮厨若是尝尝每一勺汤底,就能猜到各家配方。怎么办?「安全聚合」就是那口魔法混合锅——它保证帮厨只能尝到最终混合好的汤,永远碰不到任何单独一勺汤底。这口锅的机关,就在于每位邻居倒汤时悄悄撒一把「秘制盐」,盐与盐互相抵消,汤味恰好是大家真实食材的混合,而帮厨从头到尾看不到任何人的配方。
安全聚合是联邦学习隐私保护的核心拼图。掌握它,你就能设计出「数据不出本地、模型共享全球」的 AI 系统,这是医疗、金融等合规敏感行业对 AI 工程师的硬性要求。
目录
可视化演示
展示安全聚合六阶段流程(初始化→DH密钥交换→掩码生成→掩码上传→聚合→去掩码)、成对掩码机制原理、以及三类方案(成对掩码/秘密分享/同态加密)通信与计算开销对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
安全聚合六阶段流程 客户端通过DH密钥交换协商成对密钥,生成掩码保护个体更新 服务器仅获得掩码聚合结果,掩码求和为零实现隐私保护 server=Σ(c_i+m_i), Σm=0 六阶段协议实现隐私聚合
基本概念——为什么需要这锅「百味汤」
百家宴上,每个人都有一道独门菜,谁都不肯公开配方。但单独吃自己的菜,永远尝不到整条街的丰富味道。于是大家约定:每人把菜浓缩成一小勺「精华汤底」——这就是联邦学习中的「本地模型更新」。每个邻居在自己的厨房里,用自己的食材(本地数据)把菜做到最好(训练本地模型),最后只带一勺汤底到公共厨房。理论上,帮厨把这些汤底搅匀,就是一锅人人受益的百味汤(全局模型)。
问题出在帮厨身上。如果他好奇地尝每一勺汤底,就能大致推断出你用了什么配方——事实上,研究者早已证明,从模型更新中可以反推出训练数据的敏感信息,比如患者的病史、用户的地理位置。这正是联邦学习「数据不出本地」承诺的漏洞:数据虽然没离开,但「汤底」泄露了配方。
安全聚合(Secure Aggregation)就是为堵住这个漏洞而生的协议。它由 Google 在 2017 年提出,核心承诺只有一句话:服务器只能看到所有客户端更新的总和,无法看到任何单个客户端的更新。就像帮厨只能喝到最终搅拌好的百味汤,却永远尝不到任何一勺单独的汤底。
安全聚合的价值正在于:没有这个协议,帮厨能尝遍每一勺汤底;有了它,帮厨手里只有一整锅混合汤。而你要做的,只是多花一些「柴火钱」——这就是后面的性能代价。
- 解析求和符号这里的 $\sum$ 把 $n$ 个客户端的更新全部加起来,对应帮厨把所有汤底倒进锅里。
- 解析单个更新项$\Delta w_i$ 是第 $i$ 个邻居贡献的浓缩汤底,即本地模型训练前后的参数变化量,属于私密信息。
- 解析取平均操作除以 $n$ 得到平均更新,相当于把整锅汤按人头分勺,每个人喝到的都是均匀混合味。
威胁模型——到底在防谁偷看
宴席上总有几个让人不放心的角色。最典型的是一位「诚实但好奇」的帮厨:他会老老实实按你的菜谱把汤搅好(不篡改协议),但忍不住想偷偷蘸一下每勺汤底,尝尝各家配方。他就是联邦学习里的「诚实但好奇服务器」:计算照做,可它心里一直惦记着你的原始数据。这是安全聚合要防范的头号对手。
第二种威胁来自「夹菜的客人」——恶意客户端。有些邻居假装来参加百家宴,实则是想套取别人的配方。恶意客户端可能上传精心构造的更新来探测他人的数据,或者通过组队合谋,让服务器联合几个坏邻居一起偷看某个目标邻居的汤底。第三种威胁更隐蔽:差分攻击。帮厨虽然每次只看得到混合后的总汤,但它可以对比「李叔加入前」和「李叔加入后」两锅汤的差别,推断出李叔那勺汤底大致是什么味道。
除了恶意攻击者,还有一个谁都无法回避的现实威胁——掉线。宴席上总有邻居临时有事提前走了,如果他已经往锅里倒了汤,而他手里的「盐」配方还没交代清楚,整锅汤就可能报废。所以安全聚合协议从一开始就要为「有人中途离席」设计好应急机制。
- 解析差分信号$g^{(t+1)} - g^{(t)}$ 是攻击者观测到的两轮全局模型更新的差值,相当于对比两次宴席上的汤味变化。
- 解析目标剥离当只有第 $k$ 位邻居的汤底发生变化时,差值近似等于他的贡献除以人数 $n$。
- 解析近似记号$\approx$ 表示这只是一个估计,因为有其他邻居的更新和随机噪声干扰,真值不会百分之百暴露。
核心机制——魔法锅的两层机关
让帮厨尝不到单独汤底的机关,其实就藏在每家倒汤时那轻轻一撒的「秘制盐」里。每个邻居在倒汤前,会和每一个同伴单独约定一个随机数 $r$:你加 $r$ 勺盐,我减 $r$ 勺盐。等所有人的汤底都进锅后,每对邻居的正负盐恰好抵消为零——锅里的味道就是所有食材真实混合的味道,而帮厨眼里看到的每个汤底都是「加过盐的」,完全无法还原真实配方。
这层机关就是双掩码(成对掩码)。数学上看,第 $i$ 个客户端的更新被扰动为 $u_i = \Delta w_i + s_i$,其中 $s_i$ 是它与所有同伴掩码的代数和。把所有客户端的扰动更新加起来,掩码的总和自然归零,剩下恰好是更新的真实总和。这个设计的美妙之处在于:掩码的种子通过安全密钥协商分发,服务器不知道任何一对邻居的盐量,自然无法逐一揭开。
第二层机关是秘密共享,专门应对邻居中途离席。每位邻居在倒汤前,把自己那把盐的配方(掩码值)拆成若干份,分别交给不同的同伴保管——相当于把盐瓶分装成几份存到几个邻居家。一旦有人掉线,服务器向仍在线的邻居收集他保管的份额,拼凑起来就能恢复掉线者的盐量,从而在聚合时把掉线者的盐也抵消掉。这样,即使有人提前离席,整锅汤的味道依然毫发无损。
- 解析扰动更新$u_i$ 是第 $i$ 位邻居倒进锅里的「加盐汤底」,是真实汤底与掩码的混合。
- 解析配对掩码$s_{ij}$ 是邻居 $i$ 与邻居 $j$ 私下约定的盐量,一个人加正、一个人加负,互不知晓对方盐量。
- 解析掩码归零所有邻居的盐量加总为零,这正是混合后汤味不变的数学保证。
关键算法——Bonawitz SecAgg 的完整宴席流程
把两层机关组装成一套完整的宴席流程,就是经典的 Bonawitz SecAgg 协议。整个宴席分五个步骤。第一步「发请柬」:服务器广播本轮任务,确定哪些邻居参加。第二步「相互对表」:每个客户端与其他所有客户端两两协商密钥种子——相当于每对邻居约定好一种只有他俩知道的「盐的暗号」。第三步「分装保管」:每个客户端把需要撒的盐总量拆成秘密份额,分发给其他客户端保存。
第四步「倒汤加盐」:每个客户端用自己掌握的暗号生成与所有同伴的掩码,加到自己的汤底上,只上传这份「加盐汤底」。这时服务器虽然收到了所有人的汤底,但每一份都被盐遮盖。第五步「点名去盐」:服务器统计哪些邻居还在线,向在线客户端收集「掉线者的盐份额」,恢复出掉线者的盐量,然后在总和里把掉线者的盐抵消掉——剩下的就是所有在线客户端的真实更新总和。
这套协议还提供抗合谋保证:即使服务器暗中勾结最多一定数量的恶意客户端,只要合谋者数量不超过阈值,他们依然拼凑不出任何无辜客户端的更新。原因在于秘密共享的阈值设计——盐的份额分散在所有客户端手中,少数人凑不齐完整的盐配方。这也是安全聚合与普通加密传输的本质区别:密文可被解密查看,而这里的「盐」在数学上根本不给你单看的机会。
- 解析在线集合$\mathcal{U}$ 是宴席结束时仍在场的邻居集合,他们贡献的加盐汤底全部被用于聚合。
- 解析掉线恢复项$\hat{s}_i$ 是服务器通过收集秘密份额、为掉线邻居恢复出的盐量,相当于请在场的邻居帮忙回忆离席者撒了多少盐。
- 解析等式成立原因全体盐量归零,在线者盐量之和等于掉线者盐量的相反数,所以加上恢复值后盐被完全清除。
性能特性——这锅汤的柴火账
魔法锅虽好,柴火费却不低。最直观的代价是通信开销:每个客户端都需要与其他所有客户端建立一对一的密钥协商,$n$ 个客户端意味着大约 $n^2$ 次配对。这就像百家宴上每位邻居都要跟其他所有人低声对一遍暗号,100 户人家的社区就要对近 5000 次暗号——当联邦学习的客户端达到百万级时,这一项开销就会爆炸。
计算开销同样不容小觑。生成掩码需要运行伪随机生成器和加密算法,上传前加盐、服务器端去盐都需要额外计算。秘密共享的拆分与恢复也要进行多次模运算。在实际系统中,安全聚合通常会让每轮通信时间增加数倍,并且要求至少 $t$ 个客户端保持在线,否则无法恢复掉线者的掩码——这就是「掉线冗余」的代价:为了保证 $t$ 人可恢复,你需要发送更多冗余份额。
理解这笔「柴火账」很重要:安全聚合不是免费的午餐,而是一笔需要权衡的保险。如果只是 10 家医院的联合建模,$n^2$ 的通信完全可接受;但如果是千万台手机参与的全域联邦学习,就必须考虑优化策略或折中方案。安全性的边界,往往就是用性能换来的。
- 解析平方项$n^2 \cdot t_{\text{key}}$ 表示每对客户端都要协商一次密钥,开户配对数约为 $n(n-1)/2$。
- 解析线性项$n \cdot t_{\text{upload}}$ 是每个客户端上传一次加盐更新所需的通信量,无法省略。
- 解析复杂度级数$O(n^2)$ 说明当客户端数量翻倍时,通信量变成原来的四倍,这是规模化部署的主要瓶颈。
优化策略——让宴席更快更省
既然 $n^2$ 的配对是最大瓶颈,最简单的优化思路就是「分桌」。把 100 位邻居分成 10 桌,每桌 10 人,只在同桌内进行密钥协商和掩码配对,桌与桌之间互不干扰。这样总配对数从约 5000 次骤降到 450 次。当然,分桌会削弱跨桌隐私保护,因此实际设计往往采用「两两分组叠加」或层次化聚合,在隐私强度与性能之间取平衡。
第二招是「用机器代劳对暗号」——伪随机掩码。让所有客户端用一个公共的伪随机数生成器,只要种子(seed)一致,就能各自独立生成与同伴约定的掩码序列,无需真正两两通信协商。把配对开销从通信环节转移到了计算环节,大幅降低握手次数。第三招是「混入一点迷糊药」:在安全聚合之上叠加差分隐私噪声,虽然会略微降低模型精度,但为聚合结果增添了第二层数学保护,连「总和」都能加噪模糊。
异步并行是另一条实用路径:不再要求所有邻居同时到场,而是把客户端分成批次,先到先聚,迟到者进入下一轮。这既缓解了掉线问题,又让大锅饭不用等齐人就能开火。实际的工业系统往往同时采用分桌、伪随机和异步这三板斧,把安全聚合从「实验室的奢侈品」变成「生产线的常备工具」。
- 解析分组数$g$ 是把宴席分成的小桌数,每组约 $n/g$ 位邻居。
- 解析组内配对每组内的配对数用组合数 $\binom{n/g}{2}$ 计算,即每组每两人一对暗号。
- 解析总配对公式组数乘以组内配对数,得到优化后的总配对数 $C'_{\text{pairs}}$,对比原始 $n^2/2$ 明显下降。
应用场景——现实世界的百家宴
想象这样一个场景:全国 50 家三甲医院想联合训练一个癌症早筛 AI,但《数据安全法》和患者隐私协议都不允许任何一张影像片子离开医院。用联邦学习,每家医院本地训练模型,只上传更新;再用安全聚合,连更新都不让中央服务器看到。最终得到的全局诊断模型比任何一家单独训练的模型都精准,而任何一方都无法从协议中提取出某家医院的患者信息——这就是安全聚合在医疗健康领域的典型落地。
金融行业同样需要这口锅。多家银行希望共建一个跨行反欺诈模型,识别那些在某家银行信用良好、却在别家疯狂逾期的「多头借贷」用户。但交易流水是最敏感的商业数据,银行之间连「聚合后的特征直方图」都未必肯共享。安全聚合让各家银行各自训练欺诈检测模型,只把加盐后的更新交给联合服务器,最终得到整个行业共享的风控模型——既打破了数据孤岛,又守住了客户隐私的底线。
推荐系统与车联网也在拥抱安全聚合:手机输入法的个性化词库、短视频推荐偏好、车企的自动驾驶路况模型——凡是「数据不出端、模型要共享」的场景,安全聚合都是那把关键的锁。更有意思的是,当聚合结果需要上链存证时,安全聚合可以和区块链天然互补:聚合服务器只公布「不可见的聚合结果」,而区块链负责把这份结果永久固化,让所有人都能验证、没有人能篡改。
- 解析参与方集合$S$ 是参与联合建模的机构集合,比如 50 家医院或 20 家银行。
- 解析局部模型$w_s^{(t)}$ 是第 $s$ 家机构在第 $t$ 轮用本地数据训练出的模型参数。
- 解析全局模型所有参与方局部模型的平均值构成全局模型 $M_{\text{global}}$,每轮迭代后广播回各家继续本地训练。
工程实践——怎样当好掌勺大厨
把安全聚合搬进生产环境,第一步是选对工具。目前最常用的有 Flower(Flwr)——轻量级联邦学习框架,内置安全聚合的模拟与扩展接口;PySyft——专注于隐私计算的库,提供秘密共享和安全聚合的底层原语;TensorFlow Federated 则适合在 TensorFlow 生态中快速搭建联邦实验。对于工程师而言,不必从零实现密码学协议,但必须理解框架的隐私假设和配置项。
第二步是容错设计与参数调优。生产环境中最常见的坑是「客户端掉线率估计不足」。如果实际掉线率超过协议设定的阈值,秘密共享就无法恢复掉线者的掩码,整轮聚合宣告失败。稳妥的做法是把阈值设高一些,并让每个客户端多保留几份冗余份额。此外,批量大小、分组数量、掩码位数都会显著影响训练速度与隐私强度——分桌越多越快,但安全余量越小;掩码越长越安全,但计算越慢。这些参数要用实验数据说话。
最后一条经验是「先小规模验证,再大规模铺开」。安全聚合的开销在小规模实验中几乎可以忽略,但上到千级客户端时,通信瓶颈会突然显现。务实的做法是:先用模拟器在单机上模拟 100 个客户端验证协议逻辑,再用真实集群压测通信瓶颈,最后再逐步放开客户端规模。做过大锅饭的厨师都知道:火候和人数,永远要提前算好。
- 解析在线概率$q$ 是单个客户端在某轮聚合中保持在线并完成流程的概率,工程上通常用历史日志估计。
- 解析至少 $t$ 人在线求和下限 $t$ 是秘密共享恢复所需的最小客户端数量,低于这一人数就无法恢复掉线者掩码。
- 解析二项概率$\binom{n}{i} q^i (1-q)^{n-i}$ 表示恰好 $i$ 个客户端在线的事件的概率,累加后得到整体成功率。
AI 应用场景
医疗影像联邦诊断
阶段:模型训练与隐私保护
解决的问题:多中心医疗数据的合法共享难题。传统做法是把各医院影像数据集中到一处训练,但这直接违反患者隐私法规;不集中又导致每家医院模型因数据量不足而过拟合。安全聚合让各医院本地训练、只传加盐更新,中央服务器获得全局模型却看不到任何单家医院的梯度信息。
具体案例:某省级肿瘤专科联盟,7 家医院联合训练肺结节筛查模型。每家医院部署本地训练节点,使用 Flower 框架配合安全聚合,通过 30 轮联邦训练,模型 AUC 从单中心的 0.82 提升到联盟模型的 0.91,且通过第三方审计确认无法追溯任何患者的原始影像。
跨行多头借贷风控
阶段:数据融合与联合建模
解决的问题:「多头借贷」骗贷者利用银行间信息孤岛,在不同银行重复借贷。传统共享黑名单的方式既泄露客户隐私又触犯《个人信息保护法》。安全聚合让多家银行在不暴露各自客户特征的前提下,联合训练欺诈识别模型——服务器只看到各家银行模型更新的总和。
具体案例:某金融科技公司联合 5 家城商行搭建反欺诈联邦平台。每行本地训练 LR 模型,使用 PySyft 的安全聚合模块聚合更新。上线 6 个月,多头借贷识别召回率提升 37%,同时完成隐私合规审计,成为行业首个通过金融监管部门认可的安全聚合案例。
车联网联合驾驶模型
阶段:边缘训练与模型聚合
解决的问题:车企希望利用海量车端行驶数据优化自动驾驶决策模型,但行驶轨迹属于强敏感数据,集中上传既不可行也不划算。安全聚合让每辆车在车端完成增量训练,只上传加密掩码后的梯度,车企云端聚合出全局驾驶模型,而无法还原任何单车的行驶习惯。
具体案例:某新能源车企在 10 万辆量产车上部署联邦学习客户端,结合安全聚合与差分隐私噪声,每 24 小时聚合一轮。经过 12 周迭代,自动泊车成功率提升 22%,且通过内部红队攻击测试确认无法从梯度中还原具体路线信息。
Python 演示
import random class Client: """参与百家宴的邻居:持有私密更新,并学会加盐与保管盐份额。""" def __init__(self, cid, secret): self.cid = cid self.secret = secret # 本地模型更新(私密汤底) self.mask_sum = 0 # 本端掩码净额(盐量) self.my_shares = {} # 我分给每位同伴的盐份额 self.hold = {} # 我替每位同伴保管的盐份额 def add_mask(self, r): self.mask_sum += r def split_mask(self, peers): parts = [random.randint(1, 20) for _ in range(len(peers) - 1)] last = self.mask_sum - sum(parts) return dict(zip([p.cid for p in peers], parts + [last])) def hold_share(self, from_cid, share): self.hold[from_cid] = share def give_back(self, cid): return self.hold[cid] class Server: """聚合服务器:只能看到加盐更新,靠秘密份额恢复掉线者盐量。""" def __init__(self, clients): self.clients = clients self.updates = {} def setup(self): """两两配对生成掩码,并让每个客户端拆分自己的盐份额。""" n = len(self.clients) for i in range(n): for j in range(i + 1, n): r = random.randint(1, 9) self.clients[i].add_mask(r) # 我加盐 self.clients[j].add_mask(-r) # 你减盐 for c in self.clients: peers = [o for o in self.clients if o.cid != c.cid] c.my_shares = c.split_mask(peers) for p in peers: p.hold_share(c.cid, c.my_shares[p.cid]) def receive(self, c): self.updates[c.cid] = c.secret + c.mask_sum def aggregate(self, online_ids, offline_id): """聚合在线客户端更新,并恢复掉线者盐量以完成抵消。""" total = sum(self.updates[i] for i in online_ids) for c in self.clients: if c.cid in online_ids: total += c.give_back(offline_id) return total def main(): clients = [Client(1, 5), Client(2, -2), Client(3, 7)] server = Server(clients) server.setup() for c in clients: server.receive(c) online = [1, 3] result = server.aggregate(online, 2) truth = clients[0].secret + clients[2].secret print("安全聚合结果:", result) print("真实总和验证:", truth) if __name__ == "__main__": random.seed(42) main()
self.mask_sum = 0每位邻居的盐量初始为零,等待配对后累加。r = random.randint(1, 9); clients[i].add_mask(r); clients[j].add_mask(-r)每对邻居共享一个随机盐量,一个加正、一个加负,保证全体盐量代数和为零。self.my_shares = c.split_mask(peers)每个客户端把自己的总盐量拆成多份,分发给不同同伴保管,这就是秘密共享。p.hold_share(c.cid, c.my_shares[p.cid])同伴记录下「替谁保管了多少盐份额」,服务器日后可向在线同伴收集。server.receive(c)服务器收集到的是secret + mask_sum的加盐更新,理论上无法分离出原始 secret。total += c.give_back(offline_id)掉线者(客户端2)的盐量通过在线同伴保管的份额被恢复并加回,聚合结果恰好等于在线客户端的真实更新总和。
常见误区
误区有了 HTTPS 加密,服务器也看不到客户端上传的数据,为什么还要安全聚合?加密传输不就已经保证隐私了吗?
正解传输加密保护的是「数据在路上的安全」,但数据抵达服务器后就会被解密,服务器照样能看清每一份更新。安全聚合保护的是「服务器在计算时也看不到明文」——它保证服务器只能在密文状态下完成求和,永远无法解密出任何单独一项。你可以把 HTTPS 理解成一个上了锁的快递箱,送到后管理员会打开箱子检查;而安全聚合是一口魔法锅,食材进锅后连帮厨都分不清谁放了什么。
为何常见:人们习惯用「加密=安全」的直觉去理解隐私计算,但忽略了加密的终点往往是明文。
误区只要用了安全聚合,任何人的任何隐私都不可能泄露,可以高枕无忧了。
正解安全聚合保证的是「中间不可见」,即聚合服务器看不到单个更新。但聚合结果本身仍然可能泄露统计信息——两个邻居的加起来是 100,就能猜出其中一个大约 50。这就是前文提过的差分攻击场景。因此,严格的安全方案往往在安全聚合之上再加一层差分隐私噪声,让聚合结果本身也变得模糊,双锁齐下。
为何常见:人们容易混淆「过程保密」和「结果安全」,以为过程看不见就等于结果不会暴露。
误区如果有客户端中途掉线,它的掩码没人能解开,这轮聚合就只能作废,甚至整个训练流程都要重新开始。
正解秘密共享机制正是为掉线而生的。每个客户端在倒汤前就把自己的盐量拆成多份交给了不同同伴;掉线发生时,服务器只需向仍在线的人收集「替掉线者保管的份额」,就能恢复掉线者的盐量并完成抵消。只要在线人数不低于阈值 $t$,整锅汤的完整度丝毫不受影响。
为何常见:只看到「掩码是私密的」这一半,不知道另一半「份额分散保管」的设计。
误区安全聚合和差分隐私都往数据里加噪声/掩码,效果差不多,选一个用就行。
正解两者解决的是完全不同的问题。安全聚合掩蔽的是「谁贡献了什么」——服务器看不到个人,但总和是精确的;差分隐私掩盖的是「数据集里有什么」——给最终结果注入噪声,让攻击者无法判断某个个体是否在数据集中。一个管过程、一个管结果,实践中经常叠加使用:先安全聚合精确求和,再差分隐私模糊结果,实现双层保护。
为何常见:两者都涉及「扰动」步骤,表面形式相似,容易混淆其安全目标和数学原理。
误区客户端数量越多,大家互相掩护,攻击者越难分辨谁的贡献,所以安全性应该随规模线性提升。
正解参与者增多确实让单个客户端的贡献更难被辨认,但同时也带来了两个副作用:一是通信复杂度按 $O(n^2)$ 增长,系统更容易因资源压力而掉链子;二是合谋风险也随之增加——恶意客户端的数量一旦超过秘密共享的阈值 $t$,他们就可以伙同服务器恢复出目标客户端的掩码。安全聚合的安全性取决于「恶意参与方数量不超过阈值」这一假设,而非简单的参与方总量。
为何常见:「人多力量大」的生活直觉被错误地迁移到安全分析中,忽略了合谋阈值这一关键变量。
面试题
Q1. 安全聚合最核心的安全承诺是什么?
- A.所有数据在传输过程中都被加密
- B.服务器只能看到聚合结果,看不到任何单个客户端更新← 正确答案
- C.客户端之间永远无法互相通信
- D.全局模型对所有客户端完全不可见
答案:B。安全聚合的立足点是「帮厨只能喝到整锅汤,尝不到任何单独一勺」——服务器在数学上无法获取单个客户端的更新。A 是传输加密的范畴,C 是网络拓扑问题,D 恰恰相反,全局模型最终要广播回客户端,因此选 B。
Q2. 「诚实但好奇」服务器模型指的是什么?
- A.服务器会篡改聚合结果,恶意破坏训练
- B.服务器会主动向客户端发送虚假模型
- C.服务器能诚实执行协议,但会试图从收到的数据中推断额外信息← 正确答案
- D.服务器拒绝参与任何聚合计算
答案:C。「诚实但好奇」是安全聚合最常用的威胁模型——帮厨会老老实实搅汤(不篡改协议),但会偷蘸每一勺汤底(尝试推断单个更新)。A、B 属于「恶意服务器」行为,D 是服务不可用,均不符合该假设。
Q3. 双掩码方案中,为什么所有客户端的掩码加总为零?
- A.每个客户端都使用相同的随机数作为掩码
- B.每对客户端共享一个随机掩码,一方加正、一方加负← 正确答案
- C.服务器为所有客户端统一分配一个全局掩码
- D.掩码由差分隐私噪声自动生成
答案:B。每一对邻居约好一个随机盐量:你加 $r$、我减 $r$。于是全体盐量代数和必然为零,聚合时自然抵消。A 与 C 会导致掩码无法消除,D 混淆了差分隐私与安全聚合的掩码机制。
Q4. 秘密共享在安全聚合中解决什么问题?
- A.防止客户端上传恶意更新
- B.加速模型聚合的计算速度
- C.在客户端掉线时恢复其掩码,保证聚合不受影响← 正确答案
- D.替代差分隐私对聚合结果加噪
答案:C。秘密共享把每个人的盐量分装给同伴保管,这正是为「有人中途离席」准备的应急机制——服务器在掉线发生后,向在线同伴收集份额拼回盐量。A 是异常检测问题,B 与 D 均不是秘密共享的功能。
Q5. 关于安全聚合的通信复杂度,正确的是?
- A.随客户端数量线性增长 O(n)
- B.随客户端数量平方增长 O(n²)← 正确答案
- C.与客户端数量无关 O(1)
- D.随客户端数量指数增长 O(2ⁿ)
答案:B。核心瓶颈在于每对客户端都要协商掩码,配对数约为 $n(n-1)/2$,于是通信量按平方增长。这是安全聚合规模化落地的主要障碍,也是分组、伪随机掩码等优化策略的出发点。
Q6. 安全聚合与差分隐私的关系是?
- A.两者完全相同,可以互相替代
- B.安全聚合保护单个更新不可见,差分隐私保护聚合结果不泄露个体信息← 正确答案
- C.差分隐私是安全聚合的一种具体实现
- D.安全聚合必须依赖差分隐私才能运行
答案:B。一个管过程、一个管结果。安全聚合让服务器看不到单个更新但总和精确;差分隐私给总和结果加噪声,让攻击者无法判断个体是否在数据集中。二者互补,实践中常叠加使用。
Q7. 在 Bonawitz SecAgg 协议中,「阈值」$t$ 表示什么?
- A.参与聚合的客户端总数
- B.掉线客户端的最多数量
- C.秘密共享恢复掩码所需的最少客户端数量← 正确答案
- D.模型训练的迭代轮数
答案:C。阈值 $t$ 是「盐的份额」恢复成立的最小在线人数——只要有至少 $t$ 个客户端在线并提供份额,就能拼出掉线者的完整盐量。它既不是总数,也不是掉线数量上限,更与训练轮次无关。
Q8. 下列哪些属于安全聚合的常见优化策略?
- A.分组建簇,减少两两配对数量← 正确答案
- B.用伪随机数生成器替代显式密钥协商← 正确答案
- C.消除所有掩码,直接上传明文更新
- D.叠加差分隐私噪声提供第二层保护← 正确答案
答案:ABD。分组聚合把配对从 O(n²) 降到 O(n²/g),伪随机掩码把配对从通信环节转移到计算环节,叠加差分隐私则补上「结果模糊」的短板。C 直接放弃掩码等于放弃了安全聚合本身。
Q9. 关于安全聚合的威胁模型,以下哪些成立?
- A.诚实但好奇的服务器不会篡改协议,但会尝试推断单个更新← 正确答案
- B.恶意客户端可以互相合谋,帮助服务器攻击目标客户端← 正确答案
- C.差分攻击通过对比较前后轮聚合结果推断个人贡献← 正确答案
- D.客户端掉线后其更新会被永久清除,无法恢复
答案:ABC。A、B、C 正是威胁模型中的三类典型对手——好奇服务器、恶意合谋者、差分攻击。D 错误,因为秘密共享机制允许服务器在现场收集份额、恢复掉线者的掩码,从而保住这轮聚合。
Q10. 安全聚合相比普通加密传输的优势有哪些?
- A.服务器在计算过程中也无法看到明文数据← 正确答案
- B.支持在不可信服务器上直接完成多方求和← 正确答案
- C.无需依赖任何密钥或随机数
- D.能够防止服务器通过对比轮次差分推断个体更新← 正确答案
答案:ABD。安全聚合把「密文可解密」升级为「求和过程直接发生在密文上,解密结果只有总和」,因此即使服务器不可信也安全。它还能通过掩码机制抵御差分攻击。C 错误,安全聚合恰恰依赖随机掩码和密钥协商。