魔兽世界电子令牌数据库设计的一些推测

需求:

1. 帐号绑定,一个电子令牌可以绑定多个帐号。

2. 登陆验证,提供用户名跟电子令牌产生的动态密码。

假设:

1.电子令牌是一个电子表(能提供时间数据,但是一但出厂就不能再进行时间调整,故有时间误差存在)

2.每个电子令牌内置一个唯一的key(guid)。

3.电子令牌,根据 dPwd= hash(key+时间) 产生密码。

将dpwd跟Username,通过游戏登录界面发送到帐号服务器进行验证,获取会话Session凭证,进行游戏。

----------------------------------

数据库设计

电子令牌表(eId,key,生产信息,初始时间偏移量,...)生产企业数据库。

使用中的令牌表(eId,key,时间偏移量,Username)

令牌帐号绑定表(eId,帐号名称)

------------------------------------------

1. 绑定

input: username(游戏帐号),eId,加 clientDPwd

处理过程: 1.确定eId有效

2.根据数据库记录,计算 ServDPwd=hash(key + 当前时间)

3.比较ServDPwd==ClientDPwd

4.绑定成功,写入"使用令牌表", "令牌帐号绑定表"

2.验证

input: username,ClientDPwd

处理过程:使用绑定表获取令牌key计算ServDPwd进行对比

以上过程没考虑时间误差,假设允许正负5分钟的误差,以上两个过程应做如下调整。

1.绑定:计算 ServDPwd1= hash(key+(当前时间-5分钟)),ServDPwd2=hash(key+(当前时间-4分钟)),....

计算10组ServDPwd(1,10), 分别比较ClientDPwd,

如有 ServDPwdn=ClientDPW,记录"使用灵牌表values(eId,key,n)--n为匹配那一组的时间偏移量,注意n可为负数",

记录"帐号绑定表".

2.验证

input:username,ClientDPwd

1. ServDPwd=Hash(key+(当前时间+n)),

2. 比较ServDPwd==ClientDPwd

2.1.成功,验证通过,返回Session凭证

2.2.失败,计算ServDPwdm=Hash(key+((当前时间+n)+m)),--m为正负调整时间,可以取[-5,5].

2.2.1.比较ServDPwdm=ClientDPwd

2.2.1.1成功,更新使用令牌的"时间偏移量"字段为 "n+m"(m表示匹配的那一组偏移分钟)

-----------------------------------------------------

另外中国有1000多万魔兽世界玩家,那么用户数据库应该比较庞大,考虑验证速度,

考虑将用户名,根据首字符(a-z,0-9) ,分配到30来个数据库( 这样,每个数据库的用户数就多在100万以内了)

原文地址:https://www.cnblogs.com/wdfrog/p/1751141.html