Wow, Mangos登录时的SRP6认证
以Mangos代码为参考, 解析SRP6的原理和实现.
(转载请注明来源于金庆的专栏)
SRP全称Secure Remote Password(安全远程密码),是一个开源认证协议。
SRP简化后的原理是:
1. 服务器不保存密码或密码的散列值, 防止字典攻击.
而只是保存验证因子(verifier).
2. 客户端和服务器可以各自计算出一个会话秘钥(session key), 其值相同. 防止.
参考:
Wow 服务器解析 ( http://www.cppblog.com/Jedimaster/archive/2006/10/14/13674.aspx )
SRP Protocol Design ( http://srp.stanford.edu/design.html )
魔兽世界服务器端编写参考资料 ( http://www.asstudio.de/wow/wow.htm )
源码 mangos/src/realmd/AuthSocket.cpp
RFC2954中文翻译 ( http://www.cnpaf.net/rfc/rfc2945.txt )
SRP是什么意思?_百度知道 ( http://zhidao.baidu.com/question/59783252.html )
== Mangos SRP6认证过程 ==
1. 客户端发送用户名和版本信息
struct AUTH_LOGON_CHALLENGE_C
{
uint8 cmd;
uint8 error;
uint16 size;
uint8 gamename[4];
uint8 version1;
uint8 version2;
uint8 version3;
uint16 build;
uint8 platform[4];
uint8 os[4];
uint8 country[4];
uint32 timezone_bias;
uint32 ip;
uint8 I_len;
uint8 I[1];
};
大部份信息用来决定是否封阻该用户登录.
SRP6相关的只有I, 为用户名.
SRP6相关的字段都是按协议中的符号定义的.
1.1 _SetVSFields(rI)设置v, s字段
从数据库中获取密码散列值rI(字段名sha_pass_hash), 应该是密码p,
x = H(s, p)
v = g^x (密码学中的计算一般都是在最后对大质数N取模: v = g.ModExp(x, N);)
这个应该是验证因子v.
然后v, s存入数据库. x为临时值, 用后丢弃.
salt值s是在连接时设置的随机值.
/// Accept the connection and set the s random value for SRP6
void AuthSocket::OnAccept()
{
s.SetRand(s_BYTE_SIZE * 8);
}
s是32字节长, s_BYTE_SIZE = 32.
安全大质数N, 及其生成元g, 是固定的:
N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
g.SetDword(7);
RFC2945:
For
maximum security, N should be a safe prime (i.e. a number of the form
N = 2q + 1, where q is also prime). Also, g should be a generator
modulo N (see [SRP] for details), which means that for any X where 0
< X < N, there exists a value x for which g^x % N == X.
为了最大化安全性,N可以是一个安全的素数
(也就是,一个类似于N=2q + 1形式的数,同时q是个素数)。
而且,g将是一个以N为模的生成元,
意味着,对任何X,有0 < X < N,存在一个值x,使得g^x % N == X。
Mangos保存了密码p, 是错误的. 服务器不应该保存密码或其散列值.
应该在创建用户时, 由客户端取s值, 计算v, 将{I, s, v}传输到服务器并保存.
登录时, 特定用户的s, v应该是固定的, 从数据库读取, 而不是每次登录时随机.
1.2 取b值, 计算B
b.SetRand(19 * 8);
BigNumber gmod=g.ModExp(b, N);
B = ((v * 3) + gmod) % N;
b为19字节长的随机数. 不知为何是19字节长, 不是16或32?
b是服务器的临时秘钥, B为临时公钥.
B = kv + g^b
在SRP6中k=3, 而在最新的SRP6a中, k=H(N, g).
1.3 服务端返回 CMD_AUTH_LOGON_CHALLENGE 数据包
返回的数据结构没有用struct定义, 只是用ByteBuffer依次填入数据.
ByteBuffer pkt;
pkt << (uint8) AUTH_LOGON_CHALLENGE;
pkt << (uint8) 0x00;
pkt << (uint8)REALM_AUTH_SUCCESS;
pkt.append(B.AsByteArray(32), 32); // 32 bytes
pkt << (uint8)1;
pkt.append(g.AsByteArray(), 1);
pkt << (uint8)32;
pkt.append(N.AsByteArray(), 32);
pkt.append(s.AsByteArray(), s.GetNumBytes()); // 32 bytes
pkt.append(unk3.AsByteArray(), 16);
pkt << (uint8)0; // Added in 1.12.x client branch
SendBuf((char const*)pkt.contents(), pkt.size());
B, g, N, s 是服务器发给客户端的SRP6参数.
unk3是个16字节长的随机数, 不知道干什么用的. (unknown3?)
按SRP6的协议, 应该是客户端先发送自己的用户名和公钥(I, A), 但在Mangos中,
是服务器在没有收到A时就发送盐值和自己的公钥(s, B).
这个次序应该无关紧要. 这样做的原因是服务器要先发送N, g到客户端, 这样可少一次消息交互.
客户端计算公钥A时要用到N, g: A = g^a (隐含对N取模).
2. 客户端发送 CMD_AUTH_LOGON_PROOF 数据包请求验证
struct AUTH_LOGON_PROOF_C
{
uint8 cmd;
uint8 A[32];
uint8 M1[20];
uint8 crc_hash[20];
uint8 number_of_keys;
uint8 unk; // Added in 1.12.x client branch
};
A, M1有用
2.1 计算u, S, K
u = sha(A, B);
S = (A * (v.ModExp(u, N))).ModExp(b, N);
K = H(S);
其中K分奇偶位分别计算, 应该不是SRP的方法, 不知是否会降低散列效果.
2.2 计算M并与M1比较验证
M = sha(sha(N) xor sha(g), sha(I), s, A, B, K)
2.3 M1验证通过后计算M2, 用于客户端验证
M2 = sha(A, M, K)
2.4 服务端发回 CMD_AUTH_LOGON_PROOF
包含了 SRP6 验证的结果 M2
struct AUTH_LOGON_PROOF_S
{
uint8 cmd;
uint8 error;
uint8 M2[20];
uint32 unk1;
uint32 unk2;
uint16 unk3;
};
分享到:
相关推荐
《mangos开源魔兽世界服务器代码详解》 在IT领域,尤其是游戏开发和服务器编程方面,mangos项目是一个不容忽视的重要存在。mangos是一个开源的、基于Linux的魔兽世界服务器实现,它允许开发者和爱好者研究、学习...
6. **社区支持**:mangos项目有一个活跃的开发者和用户社区,他们共享资源、解决问题,并持续改进项目,为用户提供帮助和指导。 7. **可扩展性**:由于是开源项目,mangos 0.16允许开发者根据自己的需求进行定制,...
Linux MaNGOS-0.14.tar.gz 是一个专为MangOS游戏服务器构建的开源软件包。MangOS是一款基于Linux操作系统的大型多人在线角色扮演游戏(MMORPG)服务器模拟器,它允许玩家在本地环境中运行自己的魔兽世界服务器,用于...
在压缩包文件名称"mangos-mangos-4503f30b084db3c1efc08e6bea9cb6fb25bc60be"中,我们可以推测这可能包含了Mangos源代码的特定分支或修订版。通常,这种格式的文件名代表了Git等版本控制系统中的哈希值,用于确保...
Mangos支持WoW的lua脚本语言,允许用户编写自定义的事件处理和任务逻辑。理解lua脚本及其在Mangos中的应用是扩展游戏功能的基础。 10. **调试与优化** 分析Mangos笔记会涵盖如何调试代码、追踪错误以及优化性能,...
《Mangos_技术资料2.rar》是一个包含有关Mangos技术信息的压缩文件,其主要文件为"Mangos_技术资料2.exe"。Mangos是一个开源项目,旨在实现大型多人在线角色扮演游戏(MMORPG)服务器,特别是针对暴雪娱乐的《魔兽...
mangos服务器架构.pdf Mangos服务器架构是一种游戏服务器架构,主要用于游戏服务器的设计和实现。该架构的核心组件包括登录服、游戏服和数据库等。登录服是游戏服务器的入口,负责验证用户的账号和密码,并提供...
魔兽世界MANGOS数据库分析
mangos不是一个魔兽私服模拟器,它是一个开源的自由软件项目,是用c++和C#编程语言,实现的一个支持大型多人在线角色扮演游戏服务器的程序框架,在这个框架下,它理论上应该支持任何客户端的网络游戏,由于现在很多...
mangos不是一个魔兽私服模拟器,它是一个开源的自由软件项目,是用c++和C#编程语言,实现的一个支持大型多人在线角色扮演游戏服务器的程序框架,在这个框架下,它理论上应该支持任何客户端的网络游戏,由于现在很多...
### 开源魔兽世界服务器架构——mangos #### 一、引言 随着网络游戏的兴起和发展,越来越多的人开始关注网络游戏背后的服务器架构和技术实现。暴雪娱乐的《魔兽世界》作为一款全球知名的大型多人在线角色扮演游戏...
《mangos-0.9.0:一个开源的魔兽世界服务器实现》 "mangos-0.9.0" 是一个专为魔兽世界爱好者和开发者提供的开源项目,其核心在于实现了一个完整的游戏服务器环境。这个项目允许用户在本地搭建自己的魔兽世界服务器...
《在VS2010中成功编译Mangos-0.9.0:一份详尽的指南》 Mangos是一款开源的魔兽世界服务器软件,它允许玩家创建自己的魔兽世界私人服务器。版本0.9.0是Mangos的一个重要里程碑,提供了稳定的游戏体验。在Visual ...
主数据库:trinitydatabase ============================================= achievement_reward 巫妖王的奖励成就 areatrigger_involvedrelation 传送(区域触发)_包含的任务关系 areatrigger_scripts 区域触发脚本 ...
《MangOS 0.13 9183版:深入解析与升级指南》 在IT领域,尤其是游戏服务器开发中,MangOS是一个备受瞩目的开源项目,它为魔兽世界(World of Warcraft)的私人服务器提供了一个强大的平台。本次我们将深入探讨的是...
在压缩包"mangos-mangos-0f774431ba4718d600337875d5cf10aa6cdca3c0"中,包含了MangOS 0.13的相关源代码和资源文件,开发者可以通过这些内容了解项目的内部结构,进行二次开发或调试。对于想要参与MangOS项目的...
该存储库列出了为Mangos项目构建和运行Docker映像所需的一切。 存储库的组织方式 每个文件夹都专用于特定版本的Mangos,您可以在其中找到有关该精确版本的所有信息(从Dockerfile到部署文件)。 每个版本目前提供3个...
在使用Go-mangos时,开发者可以参考其提供的示例代码来快速上手,了解如何创建、连接、发送和接收消息。通过深入学习Go-mangos,你将能够构建出高效、可靠且可扩展的分布式系统,充分利用Go语言的特性来解决复杂的...
6. **客户端连接**:玩家需要使用魔兽世界客户端,通过修改客户端的服务器地址设置,连接到本地运行的MaNGOS服务器。 MaNGOS-0.13版本可能还包括对游戏更新的支持,以及与客户端兼容性方面的改进。用户在使用过程中...