基于时间的一次性密码算法TOTP

fisherMartyn bio photo By fisherMartyn

基于时间的一次性算法,wikiRFC 6238,我个人不喜欢看RFC等这种toooooo long的东西,在这里自己整理一下。

使用场景

TOTP的使用场景是时间有效性校验,动态生成的数据里添加时间有效性的信息能够带来巨大的安全收益。最常见的例子可能就是付款扫描的二维码、某些情况下的api接口防重放。

核心原理

TOTP的公式:TOTP = Truncate(HMAC-SHA-1(K, (T - T0) / X)),其中T是共享的密钥,T是当前时间、T0是开始计数的时间(通常可以为0),X为步长,也就是校验的时间。

从公式可以至少看到以下几个特点:

  • TOTP是非对称加密算法,即单向hash,无法反解出加密前的数据。

  • TOTP的一段时间周期有效是通过除以时间区间的整数作为hash因子来实现的。

  • TOTP的校验往往会是X的一个倍数的gap,原因我的理解是兼容不同系统间时间的差距。

实现代码

这里有一份php的TOTP实现,不过这个代码对于key做了一些base32的相关处理,在涉及跨系统调用(例如php系统和java系统之间),需要确定key处理的一致性。

其它补充

  • 创建者和校验者之间要有相对比较同步的时钟。

  • 通常需要在K之间加一次salt。

  • 创建者和校验者之间的时钟步长必须一致。