【转载】网易将军令工作原理

最近开始玩梦幻手游,为了领以前端游的返利必须输入将军令,那个已经一年没用了,输入了几次都提示错误(后来证实是系统繁忙而已),我以为是将军令时间不对了,所以用了下官网的修复功能。也对将军令修复原理有了兴趣,故搜了如下文,非常详细的讲了对将军令原理的猜测,感觉十有八九是对的,看完了觉得非常简单的一个功能,让我自己想一时还想不到。

整理的几个关键点:

1.用固定序号确保产出码的唯一性,用时间确保动态性

2.将军令本身的时间准确度是基础,比如在1星期内误差别超过1个小时我感觉就能接受(主要看矫正机制)

3.服务器产出码的时候加入时间矫正因子△t,△t会在验证时通过上下Y秒进行矫正,或者玩家点修复进行大范围匹配前后码进行矫正,初次开启时就是通过前后码匹配矫正的

4.第三点保证了玩家经常性使用△t会自动矫正,长期不使用(若差值超出自动矫正范围了)则启动前后码大范围矫正

【转载自】http://xy2.zhidao.163.com/showtopic/id_2014/

将军令的工作原理:猜想

将军令以帐号+密码+动态密码的形式对游戏id进行保护众所周知,将军令每隔一分钟变化一次6位数密码,俗称动态密码。
由于用户端(将军令)在出厂之后,同服务器端就再没有物理上直接的联系,因而,如何与服务器端保持逻辑上的同步是最大的问题,即如何保证用户端产生的动态密码与服务器端验证的动态密码是一个密码? 
猜测:用户端产生的动态密码是一个与时间有关的动态密码,即密码M与时间T之间存在着关系:M=rand(TX),rand()为随机函数,TX为随机函数的种子,X为另一因素,比如将军令的序列号等。
(1)X是一个服务器端已知的变量,出厂时就已经设定了,最大的可能是将军令的序列号、服务号或者序列号服务号所对应的一个因子,在生产将军令写入初始数据的时候,同时植入用户端和服务器端,由于每个将军令的序列号和服务号唯一,因而,拿不到将军令就无法知道X,也就无法知道动态密码M。
显然,只有因子X是不够的,M=rand(X),是产生了一个密码M,但显然无法动态变化,失去了意义。因而因子T不可缺少。 

(2)分析下,植入T之后,服务器端的T1受服务器端时钟影响,用户端T2受用户端时钟影响,问题出现了,如何保证在运行一段时间以后,T1=T2?一个方法是采用高精密的材料,保证在3年的时间里T1=T2,明显成本巨大,以市场上30元左右的电子手表为例,要保证成千上万个电子手表3年内的误差不超过1分钟,可以说是天方夜谈。 

(3)假设:服务器端固定T0,引入因子△t,服务器端植入△t,△t为用户端时钟同服务器端时钟之差,即△t=T2-T1。这样,用户端(将军令)端的密码M=rand(T2X),服务器端密码M=rand[(T1+△t)X],这样,对于成千上万的用户端(将军令)在服务器端只要记录了△t,就可以了。这个△t,可以在将军令生产的时候植入服务器端予以记录。 

(4)同步的问题可以这样解决,服务器端动态的调整△t。在开通将军令的时候,在提交序列号和动态密码的时候,服务器端计算M=rand[(T1+△t)X],并且在△t的基础上,计算出...,△t-5*60,△t-4*60, △t-3*60, △t-2*60, △t-1*60, △t, △t+1*60, △t+2*60, △t+3*60, △t+4*60, △t+5*60,...这个数列。具体数列长度根据需要来定,由于是随机6位数的函数,在这个数列中是不会出现重复的M的。这样,就可以计算出△t附近前后相差n分钟所产生的密码M,只需要比对提交的动态密码与数列中的哪个值对应,就可以动态的调整△t。假设,动态密码与△t-2*60对应的密码相同,就可以调整△t=△t-2*60。这样,解决了用户端(将军令)从出厂到开通使用所产生的时间误差。这个n,根据实际需要制定,如果出厂1个月就差几个小时的话,那将军令的质量就忒差了。

(6)在确定了△t后,服务器端在每次验证的时候,只要算出M1=rand[(T1+△t-y)X],M=rand[(T1+△t)X],M2=rand[(T1+△t+y)X],就可以算出△t附近y秒的时间的密码M,就是允许将军令有y秒的时间误差。在具体使用中,有人已经测试证明将军令是有时间误差的。如果服务器端的M与将军令的M不一样,而是服务器端的M1与将军令的M一样,就可以实时的进行动态调整△t=△t-y了,实现将军令同服务器端时间上的同步。 

(7)电子表的原理:在直流电(电池)的作用下,通过晶体管、音叉、石英晶体、大规模集成电路等等作为振荡器产生一定频率的震荡,通过固定频率的震荡来传动马达,或者驱动液晶屏等来计时。整个系统关键部位是能源(电池),振荡器,表现部分。以石英表为例,在石英晶体的表面施加一定的电压后,石英晶体会产生固定频率的震动,通过分频器后驱动马达,带动指针转动,由于频率固定,指针的转动是匀速的,只要分频调整到与时间一致,就可以计时。所以,电子手表计时是否准确关键看电池、振荡器的质量,我小的时候带的电子手表没电或者换电池后,通常不准,就是受电池电压变化的影响。。。


我想:
1、不可逆的算法,这个很容易实现,数学领域中可以找到很多,随机函数也太多太多。 
2,种子与服务器同步,对应我公式中的TX,同时植入服务器和用户端即可。 
3,每分钟动态刷新密码。植入时间因子就ok了。 
4,关键问题还是同步。从网易前阶段退出的将军令修复的措施来看,应该就是“提醒玩家主动协助对时”,跟新启用将军令几乎是同以道理。而调整频繁问题,也可以采用算法改变调整频率,减轻服务器的负担。 
5,同步的方法还有一些,如果想用的话,可以用“无线控制计时钟表”,原理是标准时间授时中心将标准时间信号进行编码,利用无线电长波发送出去,表端接收时间信号解码,调整时间,保证表端与授时中心时间高度一致。

原文地址:https://www.cnblogs.com/vanishfan/p/4377260.html