2. 密钥管理基础:对称加密、非对称加密、哈希函数、数字签名
做联邦学习安全,密钥管理躲不开。
你想想看,模型参数在客户端和服务器之间来回传,没密钥保护,等于裸奔。我个人习惯,先把这四种基本工具摸透,再谈上层协议。嗯,我们来聊聊最核心的几种工具吧。
2.1 对称加密:快,但密钥怎么分?
对称加密,说白了就是加密和解密用同一把密钥。像一把钥匙开一把锁,简洁高效。
我在项目中遇到过,公司内部文件分享,要求性能优先,我就选AES(Advanced Encryption Standard)。它块大小128位,密钥长度128、192或256位。256位的一般人破不动。
核心点:对称加密的瓶颈不是你加密快不快,是你怎么把密钥安全地送给对方。
| 算法 | 密钥长度 | 特点 |
|---|---|---|
| AES | 128/192/256 bit | 硬件加速性好,工业标准 |
| DES | 56 bit | 太老,别用了 |
| SM4 | 128 bit | 国标,国内合规场景必选 |
避坑:我曾经接手一个联邦学习项目,客户端用DES加密上传本地梯度。你知道的,56位密钥,跑个彩虹表几小时就破了。我建议:AES-256起步,别偷懒。
2.2 非对称加密:公钥加密,私钥解密
非对称加密,一对钥匙:公钥公开,私钥自己藏好。可以解决密钥分发难题。
为什么非对称加密这么重要?你在联邦学习中,服务端发加密参数给客户端,用客户端公钥加密,只有客户端能解密。你想想看,密钥都不用传了。
我的习惯:RSA(Rivest-Shamir-Adleman)经典,但慎用2048位以下长度。ECC(Elliptic Curve Cryptography)更轻量,联邦学习场景里我更喜欢它。
# 伪代码:RSA 密钥生成
key = RSA.generate(2048)
public_key = key.publickey()
private_key = key
# 联邦学习中,服务端用 public_key 加密全局参数
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(model_params)
这里有个细节:非对称加密慢,不是一个字节一个字节去加解密的。实际操作,常用混合加密(对称加密内容 + 非对称加密密钥),我就这么搭过。
2.3 哈希函数:数字指纹
哈希函数,把任意数据变成固定长度的摘要。数据变了,摘要一定变。不能逆向还原。这就是数字指纹。
在联邦学习里,我用哈希校验模型是否被篡改。比如客户端上传梯度后,服务端先哈希比较,不一样就直接扔掉。
常用算法:SHA-256,输出256位,碰撞概率极低。MD5就别用了,碰撞攻击太容易。
| 算法 | 输出长度 | 安全性 |
|---|---|---|
| SHA-256 | 256 bit | 高,推荐 |
| MD5 | 128 bit | 不安全,不要用 |
| SHA-3 | 可调 | 新一代,抗攻击性好 |
避坑:哈希不是加密,它不是用来隐藏数据的。我曾经有位同事,把模型哈希值当成加密密钥去解密,折腾了一下午。记住了,哈希是校验完整性,不是保密的。
2.4 数字签名:确认身份+防抵赖
数字签名,用私钥签名,公钥验证。别人没法伪造你的签名,黑客改数据也能查出来。
流程很简单:对哈希值签名,而不是对原文签。为什么?签名本身也慢,只签摘要就够了。
# 数字签名生成
message = b"federated learning update"
hash = SHA256.new(message)
signature = private_key.sign(hash, padding.PSS(mgf=MGF1(SHA256()), salt_length=32))
# 数字签名验证
try:
public_key.verify(hash, signature, padding.PSS(mgf=MGF1(SHA256()), salt_length=32))
print("签名有效")
except:
print("签名无效")
你在联邦学习里,服务端给客户端下发参数时,带上数字签名。客户端验一下,就知道是不是服务端本人发的。防止中间人调包。
我的经验:联邦学习的聚合服务器,每次下发全局模型前,我都强制加上签名。客户端不认签名的更新,直接拒绝。这套策略拦住了不少恶意注入攻击。
2.5 四种工具如何结合成联邦学习的密钥体系?
嗯,这四个东西不是孤立的。它们通常混着用。对称加密保速度,非对称加密传密钥,哈希保完整性,签名保身份。
小结:学完这四种工具,密钥管理的框架就立起来了。记住:对称加密负责数据加密,非对称加密负责密钥交换和数字签名,哈希负责完整性验证,数字签名负责身份认证。这四样东西,在联邦学习里缺一不可。