魔兽世界电子令牌数据库设计的一些推测
需求:
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万以内了)