mangos登录服务器-3-验证流程
来源:互联网 发布:淘宝怎么收藏店铺 编辑:程序博客网 时间:2024/06/06 00:48
整个验证过程使用到了SRP6算法.具体实现网上有很多资料.本文只是对验证的流程做个总结.
(2).从数据库获取该用户信息(sha_pass_hash,v,s,last_ip等信息).不存在 sAuthLogonChallenge_S::error = WOW_FAIL_UNKNOWN_ACCOUNT
(3).检查最后登录的ip是否与账户绑定,若已绑定且socket ip与绑定ip不同 sAuthLogonChallenge_S::error = WOW_FAIL_SUSPENDED
(4).检查用户名是否被封,被封sAuthLogonChallenge_S::error = WOW_FAIL_SUSPENDED
(5).使用sha6算法填充sAuthLogonChallenge_S结构.sAuthLogonChallenge_S::error = WOW_SUCCESS
通过以上五部后,服务器将sAuthLogonChallenge_S结构的数据包发送给客户端.
2.客户端通过上述结构体中数据,算出结果发送编号为CMD_AUTH_LOGON_PROOF的数据包,该数据包结构如下:
(1).检查客户端版本是否允许.
(2).使用SRP6计算M值,与客户端发来的M1做对比
(3).M值相同计算sessionkey.写入数据库,以便游戏服务器使用
(4) 发送sAuthLogonProof_S包.
大致为如下几步:
一.服务端通过SRP6算法验证客户端账户合法性
二.客户端账户合法生成SessionKey,告知客户端,服务端写入数据库,供游戏服务器使用.
三.客户端请求游戏服务器列表.服务端将游戏服务器列表发予客户端
typedef struct AUTH_LOGON_CHALLENGE_C{// header部分 uint8 cmd;// CMD_AUTH_LOGON_CHALLENGE uint8 error;// uint16 size;// body部分长度// body部分 uint8 gamename[4];// 游戏名 例如:WoW\0 uint8 version1;// 客户端版本号 uint8 version2; uint8 version3; uint16 build; uint8 platform[4];// 客户端运行平台 例如:x86\0 uint8 os[4];// 操作系统 win\0 uint8 country[4];// 客户端语言 zhTW\0 uint32 timezone_bias; uint32 ip;// 客户端IP地址 uint8 I_len;// 用户名长度 uint8 I[1];// 用户名,这是一个数组头指针} sAuthLogonChallenge_C;服务器收到该数据包后,作如下处理:
typedef struct{uint8 cmd;// CMD_AUTH_LOGON_CHALLENGuint8 error;// 结果uint8 unk2;// 以下成员皆为SHA6算法结果 uint8 B[32]; uint8 g_len; uint8 g[1]; uint8 N_len; uint8 N[32]; uint8 s[32]; uint8 unk3[16];} sAuthLogonChallenge_S;(1).获得客户端ip(从连接套接字获取),从数据库查询,是否被封.被封 sAuthLogonChallenge_S::error = WOW_FAIL_BANNED
(2).从数据库获取该用户信息(sha_pass_hash,v,s,last_ip等信息).不存在 sAuthLogonChallenge_S::error = WOW_FAIL_UNKNOWN_ACCOUNT
(3).检查最后登录的ip是否与账户绑定,若已绑定且socket ip与绑定ip不同 sAuthLogonChallenge_S::error = WOW_FAIL_SUSPENDED
(4).检查用户名是否被封,被封sAuthLogonChallenge_S::error = WOW_FAIL_SUSPENDED
(5).使用sha6算法填充sAuthLogonChallenge_S结构.sAuthLogonChallenge_S::error = WOW_SUCCESS
通过以上五部后,服务器将sAuthLogonChallenge_S结构的数据包发送给客户端.
2.客户端通过上述结构体中数据,算出结果发送编号为CMD_AUTH_LOGON_PROOF的数据包,该数据包结构如下:
typedef struct AUTH_LOGON_PROOF_C{ uint8 cmd;// CMD_AUTH_LOGON_PROOF uint8 A[32];// SRP6 A值 uint8 M1[20];// SRP6 M值,最终比较值 uint8 crc_hash[20]; uint8 number_of_keys; uint8 securityFlags;// 0x00-0x04} sAuthLogonProof_C;服务端收到以上包后,作如下处理
(1).检查客户端版本是否允许.
(2).使用SRP6计算M值,与客户端发来的M1做对比
(3).M值相同计算sessionkey.写入数据库,以便游戏服务器使用
(4) 发送sAuthLogonProof_S包.
typedef struct AUTH_LOGON_PROOF_S{ uint8 cmd;// CMD_AUTH_LOGON_PROOF uint8 error;// 验证成功与否标记 uint8 M2[20];// 客户端sessionkey uint32 accountFlags; // 帐号状态标记 uint32 surveyId; // 0 uint16 unkFlags;} sAuthLogonProof_S;
3.客户端发送编号为CMD_REALM_LIST的数据包,该包为5个字节.
服务端读取realmlist表和realmcharacters表,将游戏服务器列表及账户角色数量发给客户端
- mangos登录服务器-3-验证流程
- MaNGOS之验证Realm登录服务器
- mangos登录服务器-1-数据库
- mangos(二)认证登录基本流程
- mangos登录服务器-2-main注释
- 详解验证Mangos服务器:消息SMSG_AUTH_CHALLENGE,CMSG_AUTH_SESSION,SMSG_AUTH_RESPONSE
- PeopleSoft验证登录流程
- 短信验证登录流程
- UE4服务器登录流程
- Mangos服务器会话WorldSession
- MaNGOS游戏服务器设计
- mangos服务器架构
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
- web Service中遇到的问题
- JAVA中实现Callable接口来实现线程
- 谷歌锁死SDK,能阻止Android碎片化吗?
- ThinkPHP获取自动增长ID值
- Raspberry Pi之旅【序】
- mangos登录服务器-3-验证流程
- oracle数据库创建表空间,创建用户操作
- 利用百度网盘( 分享 )来更新软件(软件下载)
- 转载陈皓老师 再谈“我是怎么招聘程序员的”(下)
- Quartz 2D编程指南(1) - 概览
- Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)
- 大数据不等同于Hadoop
- javascript 字符串和数组——String和Array
- GDAL使用DEM数据计算坡度坡向