联邦学习中本地加密数据如何防止中间人攻击?

皇甫莉娟 阅读 34

最近在做前端联邦学习项目,需要加密用户数据后再上传到服务端聚合。我用AES加密数据后再通过HTTPS发送,但测试时发现中间人能通过抓包获取加密密钥。看代码哪里有问题?


const crypto = require('crypto');
const key = crypto.randomBytes(32); // 固定生成密钥

function encryptData(data) {
  const iv = crypto.randomBytes(16);
  const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
  const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
  return { iv: iv.toString('hex'), encrypted: encrypted.toString('hex') };
}

// 将密钥和加密数据一起发送到服务端
fetch('/aggregate', {
  method: 'POST',
  body: JSON.stringify({
    key: key.toString('hex'),
    ...encryptData(userSensitiveData)
  })
});

服务端要求必须在客户端完成加密,但这样传输密钥本身不就暴露了?难道联邦学习场景下密钥不应该随每个请求动态生成?有没有更安全的密钥交换方案?

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
Newb.玉曼
你说的这个问题确实很关键,直接把密钥和加密数据一起传过去,那中间人抓到包后等于白加密了。AES是对称加密算法,密钥的安全性是核心,不能直接暴露在传输中。

联邦学习场景下,推荐用非对称加密来解决密钥交换的问题。比如你可以用RSA或者ECDH来做密钥协商。服务端提前生成一对公私钥,把公钥发给客户端,客户端用公钥加密AES密钥后再传给服务端,这样即使被抓包也拿不到原始密钥。

下面是一个改进的代码示例,假设服务端已经提供了公钥:

const crypto = require('crypto');
const serverPublicKey = -----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK...(服务端公钥内容)
;
const key = crypto.randomBytes(32); // 动态生成AES密钥
const iv = crypto.randomBytes(16);

// 用服务端公钥加密AES密钥
function encryptKeyWithPublicKey(key, publicKey) {
const encryptedKey = crypto.publicEncrypt(
{ key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
key
);
return encryptedKey.toString('base64');
}

// 加密数据
function encryptData(data, key, iv) {
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
return encrypted.toString('hex');
}

// 发送数据
const encryptedKey = encryptKeyWithPublicKey(key, serverPublicKey);
const encryptedData = encryptData(userSensitiveData, key, iv);

fetch('/aggregate', {
method: 'POST',
body: JSON.stringify({
encryptedKey: encryptedKey,
iv: iv.toString('hex'),
encryptedData: encryptedData
})
});


服务端收到后用自己的私钥解密出AES密钥,再用这个密钥解密数据。这种方式能有效防止中间人攻击,因为公钥可以公开,但私钥只在服务端保存。

另外提醒一下,AES密钥每次请求都要动态生成,别复用!不然安全性会大打折扣。希望这些建议能帮到你,有问题咱们再交流!
点赞
2026-02-14 07:00