明文协议的包被抓包重放、被中间人篡改的故事在上一代游戏里层出不穷。消息加密层给会话加一层密钥协商:每次登录派生独立密钥,载荷全程加密,抓包者看到的是一串无效字节。
---握手:双方随机数派生会话密钥
function Crypto.handshake(actor, clientNonce)
local serverNonce = Crypto.randomBytes(16)
-- 双随机数加预置种子派生 128 位会话密钥
actor.sessionKey = Crypto.derive(
clientNonce, serverNonce, PRESEED)
actor.keyAt = os.time()
-- 服务器随机数回传,客户端可派生同一密钥
return serverNonce
end
---载荷的加解密
function Crypto.seal(actor, body)
local iv = Crypto.randomBytes(8)
return iv .. Cipher.crypt(body, actor.sessionKey, iv)
end
function Crypto.open(actor, pkt)
local iv = pkt:sub(1, 8)
return Cipher.crypt(pkt:sub(9), actor.sessionKey, iv)
end
握手交换双方的随机数,客户端随机数随登录请求上行,服务器随机数随握手响应下行,双随机数加预置种子派生出 128 位的会话密钥——双方各自算出同一把钥匙,密钥本身不在网络上传输。每个会话的密钥独立,抓到一个会话的密钥推不出另一个会话的。载荷加密用会话密钥加随机 IV,同样的内容每次密文不同,重放与比对分析的难度双双抬升。
---密钥的定时轮换:30 分钟一换
setontimerex(78, 1800)
function Crypto.rotate()
for _, actor in pairs(Online.all()) do
if os.time() - actor.keyAt > 1800 then
actor.oldKey = actor.sessionKey
actor.sessionKey = Crypto.derive(
actor.sessionKey, Crypto.randomBytes(16))
actor.keyAt = os.time()
actor.keyPhase = "switching"
end
end
end
---切换期的双密钥解密
function Crypto.openSmart(actor, pkt)
local body = Crypto.open(actor, pkt)
if not body and actor.oldKey then
actor.sessionKey = actor.oldKey
body = Crypto.open(actor, pkt)
actor.sessionKey = Crypto.currentKey(actor)
end
return body
end
密钥 30 分钟轮换一次,轮换的派生用旧密钥加新随机数——旧密钥的暴露不危及轮换后的安全。切换期的双密钥解密兜住在途的包:轮换瞬间客户端还拿旧密钥加密的包用旧钥解开,新包走新钥,切换对玩家零感知。加密的性能账要算清:批量包(移动、飘字)的加密开销在千分之几毫秒级,千人同屏的总量可控;解密失败进静默计数,连续失败即协议异常处理。加密层与签名的分工:加密管保密、签名管完整,两层各司其职不互相替代。
加密的互通测试:新旧客户端与多版本服务器的握手矩阵全绿;解密失败的计数监控,失败率的突增提示密钥状态失步。
随机数曾经用固定种子,两台服务器的会话密钥相同,种子接入引擎的熵源。轮换曾经没有双密钥期,切换瞬间的在途包解密失败被当攻击踢线,切换期的兜底解密修复。IV 曾经复用,相同内容的密文相同让频度分析有机可乘,IV 每包随机。
加密对全部写操作协议强制,读协议的明文容忍按数据敏感度评估。密钥的轮换周期与算法参数进配置,算法的升级预留版本号字段。握手失败的处置与风控联动,握手异常的客户端版本进观察名单。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 行会等级是行会玩法的地基:建筑上限、商店货架、活动资格全部挂在等级上。行会经验与等级成长框架把升级路径做…
实战应用:用在哪里 行会走过两年,第一次拿下沙巴克、第一位满级成员、最强的一次攻防战,这些瞬间散落在聊天记录里无人记得。行会…
实战应用:用在哪里 两服合服时允许玩家自由抢注重名角色,结果原服老玩家“至尊战神”的名字被另一服新号抢先注册,老玩家两年的社…
实战应用:用在哪里 热门行会一天几十份入会申请,逐条点开看效率极低还容易漏人。行会申请列表把申请铺成可批量操作的清单:每行显…
实战应用:用在哪里 炼狱回廊是高端玩家的试炼场:十层回廊逐层深入,每下一层全属性递减百分之五,越往深处怪物越强、自己越弱,奖…
实战应用:用在哪里 本服押镖产出稳定但缺乏刺激,高战玩家押镖像散步。跨服镖局把押运拉到跨服边境:路线穿越两服交界的无主之地,…