网易将军令推出后,以帐号+密码+动态密码的形式对游戏id进行保护,大大提高了帐号的安全性。对于将军令的工作原理,很多人提出自己的猜想,本人也就自己的想法阐述一二.希望梦想可以做的更好.
众所周知,将军令每隔一分钟变化一次6位数密码,俗称动态密码。由于用户端(将军令)在出厂之后,同服务器端就再没有物理上直接的联系,因而,如何与服务器端保持逻辑上的同步是最大的问题,即如何保证用户端产生的动态密码与服务器端验证的动态密码是一个密码?
猜测:用户端产生的动态密码是一个与时间有关的动态密码,即密码M与时间T之间存在着关系:M=rand(TX),rand()为随机函数,TX为随机函数的种子,X为另一因素,比如将军令的序列号等。
这里,X是一个服务器端已知的变量,出厂时就已经设定了,最大的可能是将军令的序列号、服务号或者序列号服务号所对应的一个因子,在生产将军令写入初始数据的时候,同时植入用户端和服务器端,由于每个将军令的序列号和服务号唯一,因而,拿不到将军令就无法知道X,也就无法知道动态密码M。
显然,只有因子X是不够的,M=rand(X),是产生了一个密码M,但显然无法动态变化,失去了意义。因而因子T不可缺少。
说到这里,有人会说,那干脆一起植入T,不就得了。
分析下,植入T之后,服务器端的T1受服务器端时钟影响,用户端T2受用户端时钟影响,问题出现了,如何保证在运行一段时间以后,T1=T2?一个方法是采用高精密的材料,保证在3年的时间里T1=T2,明显成本巨大,以市场上30元左右的电子手表为例,要保证成千上万个电子手表3年内的误差不超过1分钟,可以说是天方夜谈。
因此,必然有一个关于T 的逻辑上的纠正。
大胆假设:服务器端固定T0,引入因子△t,服务器端植入△t,△t为用户端时钟同服务器端时钟之差,即△t=T2-T1。这样,用户端(将军令)端的密码M=rand(T2X),服务器端密码M=rand[(T1+△t)X],这样,对于成千上万的用户端(将军令)在服务器端只要记录了△t,就可以了。这个△t,可以在将军令生产的时候植入服务器端予以记录。
这里,仍然没有解决双方同步的问题。
同步的问题可以这样解决,服务器端动态的调整△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个月就差几个小时的话,那将军令的质量就忒差了。
在使用将军令的时候,采用同样的方法可以同步。在确定了△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了,实现将军令同服务器端时间上的同步。
有人尝试破解将军令,看来较难。首先不知道X,其次不知道△t,因而将军令的保密性还是不错的。
转载:http://zhidao.baidu.com/question/24789502.html?fr=qrl3