CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
网络通信

【网络通信】消息加密层:会话密钥的协商流程

2026-09-23 16:58 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本

实战应用:用在哪里

明文协议的包被抓包重放、被中间人篡改的故事在上一代游戏里层出不穷。消息加密层给会话加一层密钥协商:每次登录派生独立密钥,载荷全程加密,抓包者看到的是一串无效字节。

密钥的协商

lua

---握手:双方随机数派生会话密钥
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,同样的内容每次密文不同,重放与比对分析的难度双双抬升。

密钥的轮换

lua

---密钥的定时轮换: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 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

框架设计行会等级经验成长

【框架设计】行会等级:行会经验与等级成长框架

实战应用:用在哪里 行会等级是行会玩法的地基:建筑上限、商店货架、活动资格全部挂在等级上。行会经验与等级成长框架把升级路径做…

2026-09-23 19:15 996 技术组 · 0 阅读
玩法策划大事记里程碑展示

【玩法策划】行会大事记:里程碑事件的自动记录与展示设计

实战应用:用在哪里 行会走过两年,第一次拿下沙巴克、第一位满级成员、最强的一次攻防战,这些瞬间散落在聊天记录里无人记得。行会…

2026-09-23 19:15 996 技术组 · 0 阅读
案例复盘合服抢注重名复盘

【案例复盘】合服抢注:重名抢注引发的归属纠纷复盘

实战应用:用在哪里 两服合服时允许玩家自由抢注重名角色,结果原服老玩家“至尊战神”的名字被另一服新号抢先注册,老玩家两年的社…

2026-09-23 19:15 996 技术组 · 0 阅读
前端接口行会申请审批列表

【前端接口】行会申请列表:入会申请的批量审批界面

实战应用:用在哪里 热门行会一天几十份入会申请,逐条点开看效率极低还容易漏人。行会申请列表把申请铺成可批量操作的清单:每行显…

2026-09-23 19:15 996 技术组 · 0 阅读
引擎触发炼狱回廊递减增益

【引擎触发】炼狱回廊:逐层递减的增益触发设计

实战应用:用在哪里 炼狱回廊是高端玩家的试炼场:十层回廊逐层深入,每下一层全属性递减百分之五,越往深处怪物越强、自己越弱,奖…

2026-09-23 19:15 996 技术组 · 0 阅读
玩法策划跨服镖局押运跨服

【玩法策划】跨服镖局:跨服押运的高风险高回报设计

实战应用:用在哪里 本服押镖产出稳定但缺乏刺激,高战玩家押镖像散步。跨服镖局把押运拉到跨服边境:路线穿越两服交界的无主之地,…

2026-09-23 19:15 996 技术组 · 0 阅读