基于时间的一次性算法,wiki 和RFC 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。
-
创建者和校验者之间的时钟步长必须一致。