数据泄露事故中,最棘手的往往不是黑客直接拖走数据库,而是多方协作时不得不把原始数据搬到一起。医疗联合建模、金融反欺诈、政务数据融合等场景都面临同一个矛盾:模型需要更多样本,但数据因合规要求和商业利益不能离开本地。联邦学习与同态加密给出了两条互补的路线,前者从数据分布上减少暴露面,后者从计算过程上降低明文流转。两者结合后,原始数据既不直接出域,传输的中间量也难以被反推。

一、联邦学习如何把数据留在本地
联邦学习的基本目标不是隐藏模型,而是减少原始数据的移动。以横向联邦学习为例,多个参与方各自持有特征相同但样本不同的数据,比如不同城市的银行都有用户的年龄、收入、历史违约记录等字段。训练开始时,协调方把初始模型参数下发给各参与方;参与方用本地数据计算梯度或更新后的权重,只把模型更新传回协调方。原始样本始终不离开本地环境。
最常用的聚合算法是联邦平均,英文简称FedAvg。协调方收到多个参与方的更新后,并不简单平均,而是按照本地样本量加权。这样做可以避免小数据量参与方的噪声过度影响全局模型。下面这段Python逻辑演示了联邦平均的权重合并过程,假设每个客户端已经完成本地训练,返回了更新后的权重列表。
def fedavg(global_weights, client_updates, client_sizes):
total = sum(client_sizes)
new_weights = []
for idx in range(len(global_weights)):
weighted_sum = None
for update, size in zip(client_updates, client_sizes):
if weighted_sum is None:
weighted_sum = update[idx] * size
else:
weighted_sum += update[idx] * size
new_weights.append(global_weights[idx] + weighted_sum / total)
return new_weights
# client_updates是各参与方本地训练后与全局权重的差值
# client_sizes是各参与方的样本数量,用于加权
联邦学习虽然减少了样本直接出域,但模型更新并不是绝对安全的。梯度可以被用来重构部分训练样本,尤其在图像和文本任务上,已有研究表明通过梯度反推用户隐私并非不可能。因此,单纯依靠联邦学习并不能完全解决数据泄露问题,它需要与加密、差分隐私或可信执行环境配合。
二、同态加密如何让密文参与计算
同态加密解决的是另一个环节的问题:数据即使要被计算,也不需要先解密成明文。传统加密保证的是静态安全和传输安全,密文只能存、只能传,一旦要计算就必须解密。同态加密允许在密文上直接执行特定运算,解密后得到的结果与对明文执行同样运算一致。这种性质非常适合隐私计算场景。
按支持的运算类型和次数,同态加密可以分成部分同态、层级同态和全同态。Paillier是最常见的加法同态方案,适合对整数进行密文求和,但不能高效做乘法。CKKS属于层级同态,能够同时支持加法和乘法,并且天然面向浮点数,更适合机器学习中的梯度、权重和推理输出。下面示例使用TenSEAL库创建一个CKKS上下文,对两个加密向量做加法和点积。
import tenseal as ts
context = ts.context(
ts.SCHEME_TYPE.CKKS,
poly_modulus_degree=8192,
coeff_mod_bit_sizes=[60, 40, 40, 60]
)
context.global_scale = 2 ** 40
context.generate_galois_keys()
x = [0.1, 0.5, -0.3]
y = [0.7, 0.2, 0.9]
enc_x = ts.ckks_vector(context, x)
enc_y = ts.ckks_vector(context, y)
enc_sum = enc_x + enc_y
enc_dot = enc_x.dot(enc_y)
dec_sum = enc_sum.decrypt()
dec_dot = enc_dot.decrypt()
print(dec_sum) # 接近 [0.8, 0.7, 0.6]
print(dec_dot) # 接近 0.1*0.7 + 0.5*0.2 - 0.3*0.9
从这段代码可以看到,明文计算中的加法和点积被迁移到密文对象上,密文结果需要解密才能读回。实际部署时,公钥加密、私钥解密,参与方可以持有公钥对梯度做加密,协调方只能看到密文,无法获知单方梯度,却能完成聚合。这样就把联邦平均中的聚合步骤放到了密文空间。
三、两者结合的典型架构与工程难点
一个相对成熟的组合架构是:各参与方先在本地训练出更新,用同态加密的公钥加密更新,再把密文更新发送给协调方。协调方在密文上执行加权聚合,得到密文全局模型或密文聚合梯度,然后根据密钥管理策略进行解密或让参与方协助解密。整个过程里,协调方接触不到个体明文更新,外部攻击者也难以从传输链路上直接读取有效信息。
这种架构会带来三个现实成本。第一是通信开销,CKKS密文比明文大得多,一个普通的梯度向量加密后可能膨胀几十倍甚至几百倍。第二是计算延迟,密文乘法需要多次模乘和重线性化操作,聚合速度远低于明文加法。第三是密钥管理,如果所有参与方共用一对公私钥,任何一方泄露私钥都会影响全局;如果使用多方同态加密,解密需要多方参与,密钥协商和执行流程会进一步复杂化。
工程上通常不会对所有模型参数都做同态加密,而是先筛选敏感的更新部分,或与差分隐私结合。差分隐私可以在更新中注入噪声,降低梯度反推风险;同态加密则保证传输和聚合阶段不暴露明文。两者叠加会增加精度损失,因此需要在隐私预算和模型性能之间设置可配置的策略。
四、落地前必须想清楚的信任边界
联邦学习加上同态加密能够明显降低数据泄露概率,但并不能解决所有威胁。诚实但好奇的协调方可能尝试从密文更新中恢复信息,恶意参与方可能上传投毒更新影响全局模型,数据分布不均也会导致某些群体的贡献被淡化。因此,落地时必须先明确各参与方的信任假设和系统边界。
如果协调方完全不可信,单纯依赖同态加密还不够,因为解密环节仍然存在明文暴露窗口。此时可以引入可信执行环境来保护解密和聚合过程,或者采用多方安全计算完成比较、除法等非线性操作。如果参与方不完全可信,则需要在聚合前加入异常检测和贡献审计,防止模型投毒。
从实践角度看,小规模内部协作可以从联邦学习加Paillier加法聚合起步,先用较低开发成本验证流程;对精度和吞吐有更高要求的场景再引入CKKS或全同态方案。无论选择哪条路线,都需要把数据泄露风险拆成存储、传输、计算、解密四个阶段逐一评估,而不是把两类技术简单理解为万能开关。