根据时间生成手机令牌密码的原理是什么?

根据时间生成手机令牌密码的原理是什么?

无论硬件令牌也好还是手机上的软件令牌也好,如果是那种只是一个LCD显示6个数字的,都是时间和服务器同步过。

具体工作方式如下:

首先密码学里有个东西叫伪随机数生成器(PRNG),这个东西很好玩,它和用于产生真正随机数的随机数生成器不一样,PRNG一般都有一个种子值,所谓的种子值就是它的初始值。同一个种子值在同样结构的PRNG里每次运行都会生成相同的随机数序列。如果不知道种子值,那么生成的随机数可以说是很难预测的。(此处挖个坑,坑1)

目前用的最多的PRNG叫线性反馈移位寄存器 Linear feedback shift register,LFSR

最基本的是这个结构,也有很多种变形。

图片来自wikipedia

那4个方格里面的就是种子值,seed。现在回到坑1里,LFSR生成的随机数是会重复的,在LFSR结构可靠(涉及到数论里的有限域问题)的情况下,可以产生2^种子长度 -1 个不重复随机数序列,过了这个数字,就会又回到前一个序列的第一个输出。所以种子长度决定了随机数生成器的强度。

前面我们说过,不同的种子在相同的LFSR里会产生完全不同的随机数序列,所以这个种子可以作为一个密钥,每个令牌里的种子值都不一样,一般来说这种令牌的种子长度都在32位以上,也就是说能生成长度为2^32-1的不重复二进制随机数序列。

那么在颁发手机令牌或者硬件令牌的时候,服务器会生成一个随机的种子值,写入令牌软件或者硬件里,并且服务器自己也保存了一份。

下面回到LFSR上,LFSR可以很简单的用硬件电路或者软件实现,输出和输入值都是二进制,每个时钟周期会执行一次,输出一位二进制数字。

所以如果服务器和客户端使用同样格式的LFSR,用同样的种子值,执行相同次数,就会一直输出一样的数字,把二进制数字做一些处理,比如每次输出20位二进制数字,转换成10进制之后去掉6位以后的数字,再显示出来。这样在令牌和服务器时间同步的情况下,就可以生成出相同的数字,当提交到服务器的时候,服务器就可以对比令牌和服务器上利用相同算法和保存的种子值生成的数字。

所以硬件令牌里面会有一个精确度比较高的时钟,而手机也利用了内置时钟,而且还可以通过网络更加精确的同步时间。

可能有点没说明白,下面我换一个简单的说法:

你(令牌)和你朋友(服务器)约好一个预设的数字,假设是100。同时也和你朋友商量好,在一天24小时里,假如我们打电话或者在网上聊天,我们要预先对暗号,暗号通过了才能开始聊,当然暗号不能一直不变,假如我们在0点到1点内通讯,就把暗号乘以1,假如1点到2点通信,就把暗号乘以2,以此类推。

于是你在下午17点的时候给你朋友打电话,你一看表,现在正好17点03分,暗号数字要乘以17,所以是1700,你在电话里和你朋友说,暗号是1700。你朋友听了后,一看表,现在17点03,和你的暗号是100,100*17是1700,暗号正确,好,继续聊天。

假如这个朋友比较怪异,和每人聊天都要对暗号,而且每个人的暗号都不一样,可能和张三的暗号是100,和李四就是123,王五则是567,他把每个人的暗号和对应的名字都写在一个小本(数据库)上,方便每个人打电话过来的时候随时查看。

假如有一天你或者你朋友的表不准了,误差越大,那么在任意时间对不上暗号的可能性越高。