魔兽世界电子令牌数据库设计的一些推测
需求:
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万以内了)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述