OTP

最近用了中国银行的网银,虽然整体体验很烂,但是动态密码还是很有趣,细思量下来,里面有很多门道。

动态密码(OTP)

动态密码是一种实时变化的密码,银行里所用的是同步的密码技术,其同步方案又分为基于时间的同步方案和基于事件的同步方案。基于事件的密码生成需要两个基本输入:原定的密码种子和用户的特定事件(如登录,或者某个生成密码的操作等)。在用户的生成密码之后,服务器这一端会根据相同的事件和密码种子生成密码,来验证用户的输入是否正确。但是基于事件的密码是需要与服务器交互的,使用起来并不方便。在这里就不多介绍了。

基于时间同步的动态密码。

现在中行的密码动态口令卡就是这种技术,简单方便,不需要与服务器有交互,看起来是一个很神奇的东西。
基于时间同步的动态密码,原理上类似于一次性密码本ONP(one-time pad ),根据时间变化来生成不同的密码。在银行的使用过程中会发给用户一个专门硬件,这个硬件采用与服务器相同的密码生成算法,根据时间的变化生成密码。当需要用户输入一次性密码时,服务器会查询此时应该生成的密码,从而将用户输入密码与服务器密码相比对。基于时间同步的动态密码技术,其中一个关键在于用户的硬件与服务器的时间必须保持一致,否则便会出现所生成的密码不一致的问题。目前时间同步令牌一般通过增大偏移量的技术( 前后10mins) 来进行远程同步, 确保其能够继续使用, 降低对应用的影响; 但对于超出默认的时间同步令牌( 共20mins) , 将无法继续使用或进行远程同步, 必须送回服务器端另行处理。

相关实现

目前关于时间同步的的算法已经有OATH的TOTP规范也有相关的开源项目实现。