完整课程入口:996 全套课程体系 | Lua 学习路径 | 幂尔框架 mirs.cn
登录链路同时有两个矛盾需求:密钥要安全交换(RSA 擅长,但慢),数据要高频加密(AES 擅长,但密钥难分发)。混合加密是标准答案:RSA 只传 AES 密钥,AES 负责后续全部数据加密。适用于登录握手、充值通道、跨服通信三类高价值链路。
-- 客户端:生成一次性 AES 密钥,用服务器公钥加密后发送
local aesKey = randomHex(32)
local encrypted = rsaEncrypt(serverPublicKey, aesKey)
send({ cmd = "KEY_EXCHANGE", data = encrypted })
-- 服务器:私钥解出 aesKey,之后双方用 aesKey 做对称加密
session.aesKey = rsaDecrypt(serverPrivateKey, msg.data)
RSA 密钥对由服务器生成,公钥随登录页下发,私钥永不离开服务器。一次 2048 位 RSA 加解密约 2~5ms,登录只做一次,开销可忽略;握手后的每条消息用 AES-128-CBC 加密,单条加解密耗时微秒级。
会话密钥轮换:握手密钥只在登录会话内有效,每 30 分钟轮换一次(轮换流程参考会话密钥专篇)。防重放:握手请求带时间戳与客户端 nonce,服务器记录 nonce 拒绝重放,防止攻击者录下握手包反复建立会话。私钥保护:服务器私钥文件权限 600,进程重启需人工解锁,杜绝私钥随代码仓库泄漏的可能。
996 单服登录链路实测:RSA 2048 握手增加 4.1ms,AES 后续消息加解密单条 0.02ms,玩家无感。边界说明:RSA 只用于"传密钥"与"传签名",不要用它加密大段数据(单块上限 245 字节且性能差);AES 用 CBC 或 GCM 模式,ECB 模式禁用(相同明文块输出相同密文,模式特征会被识别)。混合加密实施后,配合防重放与包体签名,登录与充值两条链路的安全基线即达到商业服标准。
实施清单五项:生成并部署 RSA 密钥对、客户端内置公钥、握手接口上线、AES 会话加密接入、nonce 表与时间窗校验开启。每项单独验收后再进入下一项,出现联调问题时按清单回退到上一项定位,比整体排查快得多。