在上篇TOTP基本原理中讲述了其原理,本篇将讲述如何使用。
场景1,动态口令验证
这个是TOTP最常见的用法,基本步骤如下:
- 确认共享密钥,以及时效;(假设,共享密钥为“dynamic password”, 时效为30秒)
- 客户端生成动态口令
- 服务器端验证动态口令
我用python模拟了这个过程,代码如下:
totoSize = 6
ttl = 30
key = 'dynamic password'
dp = DynamicPasswor()
secretKey = dp.secretKey(key)
def main(beginTime, second):
print('等待',second,'秒')
clientDP = dp.client(beginTime, secretKey, totoSize, ttl)
time.sleep(int(second))
serverDP = dp.server(beginTime, secretKey, totoSize, ttl)
print('client: ', clientDP, ', server: ', serverDP, ', compare: ', (clientDP==serverDP))
if __name__ == "__main__":
beginTime = int(time.time())
main(beginTime, 5)
beginTime = int(time.time())
main(beginTime, 29)
beginTime = int(time.time())
main(beginTime, 31)
详细代码在这里
运行结果如下:
等待 5 秒
client: 095051 , server: 095051 , compare: True
等待 29 秒
client: 095051 , server: 095051 , compare: True
等待 31 秒
client: 095051 , server: 461896 , compare: False
场景2,加密
将totp的值作为密钥的一部分,也是一种比较常见的方式,步骤如下:
- 确认共享密钥,以及时效;(假设,共享密钥为“encrypted password”, 时效为30秒)
- 服务器端生成baseKey,以及totp,将baseKey和totp合并以后,使用对称加密(DES或AES)
- 服务器端将baseKey和加密后的密文发送给客户端
- 客户端将baseKey与本地计算的totp合并,解密(对称加密:DES或AES)
python的模拟代码如下(示例中用的是DES的对称加密算法):
totoSize = 4
ttl = 30
key = 'encrypted password'
ep = EncryptorPassword()
secretKey = ep.secretKey(key)
baseKey =ep.randomword(4).encode()
content = 'test content'
def main(beginTime, second):
print('等待',second,'秒')
ecryptContent = ep.server(beginTime, secretKey, totoSize, ttl, baseKey, content)
time.sleep(second)
decryptContent = ep.client(beginTime, secretKey, totoSize, ttl, baseKey, ecryptContent)
print('decrypt result: ',decryptContent)
if __name__ == "__main__":
beginTime = int(time.time())
main(beginTime, 29)
beginTime = int(time.time())
main(beginTime, 30)
beginTime = int(time.time())
main(beginTime, 31)
详细代码在这里
运行结果如下:
等待 29 秒
decrypt result: test content
等待 30 秒
decrypt result:
等待 31 秒
decrypt result:
很明显29秒以后就无法解密