今天看到一个有趣的问题:
支付宝和微信的付款没网络时也可以支付是怎么做到的?
微信和支付宝的脱机二维码实现原理?
了解到了这种算法:TOTP基于时间的一次性密码算法
这种算法广泛用于两步验证中。
可以先看一下定义:
维基百科:http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm
RFC 6238:http://tools.ietf.org/html/rfc6238
先决条件:
1)Prover与Verifier之间必须时钟同步;
2)Prover与Verifier之间必须共享密钥;
3)Prover与Verifier之间必须使用相同的时间步长
算法变量(查看下面的代码):
K 共享密钥
T 时间
T0 开始计数的时间步长
X 时间步长
原理:
首先确保先决条件后考虑:
- 客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程
- 获取当前时间
currentTime
,并计算T = (currentTime-T0)/X
,取得T
的值后在根据该算法算出对应的密钥。
公式:
TOTP = Truncate(HMAC-SHA-1(K, (T - T0) / X))
实现代码: