OTP基本原理
本篇文章呢,我们一起来看一下有关于OTP用到的一些密码学知识,那么什么是OTP这个名词可能读者有可能不了解,但是相信大家可能都见过或者用过多因子认证这个东西吧。
那么,作为一个客户端,怎么能保证和服务端生成的这个6位的随机密码一致呢,本文来看下OTP的相关知识。
定义
一次性密码(One-Time Password, 「OTP」), 是指计算机系统或其他数字设备上只能使用一次的密码,有效期为只有一次登录会话或交易。OTP的产生方式,主要是以时间差做为服务器与密代码生成器的同步条件。在需要登录的时候,就利用密代码生成器产生动态密码,OTP一般分为计次使用以及计时使用两种,计次使用的OTP产出后,可在不限时间内使用;计时使用的OTP则可设置密码有效时间,从30秒到两分钟不等[1而OTP在进行认证之后即废弃不用,下次认证必须使用新的密码。接下来我们分别来看一下这两种方式产生的一次密码。
HOTP
基于HMAC的一次性密码算法(HMAC-based One-time Password algorithm,「HOTP」)是一种基于散列消息验证码(HMAC)的一次性密码(OTP)算法。
简单描述一下上面的过程,这个算法需要提前协商一个密钥,然后计数器和客户端需要共享一下,然后根据上面图中的过程,详细过程可以参考下RFC4226。
代码实现
这里,偷个懒,用Python写吧,不折腾了。
import hmac
def hotp(key, counter):
_h = hmac.new(key, digestmod="sha1")
_h.update(str(counter).encode("utf-8"))
out = _h.digest()
idx = out[-1] & 0x0F
value = int.from_bytes(out[idx:idx + 4], byteorder="big")
return value % 10 ** 6
if __name__ == '__main__':
print(hotp(b"111", 2))
这个代码比较简单,这里就不解释了,上面图画的还算可以。
TOTP
基于时间的一次性密码算法(Time-based One-Time Password,简称:「TOTP」)是一种根据预共享的密钥与当前时间计算一次性密码的算法。
这个就不画图了,因为这个吧counter换成时间戳,就完事儿了,直接看代码吧。
def totp(key):
counter = int(time.time()) // 30
_h = hmac.new(key, digestmod="sha1")
_h.update(str(counter).encode("utf-8"))
out = _h.digest()
idx = out[-1] & 0x0F
value = int.from_bytes(out[idx:idx + 4], byteorder="big")
return value % 10 ** 6
这里对于TOTP和HTOP有点不同,在于时间要除以30,这个是一次性密码的过期时间,一般是30s,当然也可以改,具体说明可以参考RFC6238。
总结
最后呢,(套路的来个总结,多水一点字数),本文呢主要介绍了OTP的两种方式,一个是基于计数的,一个基于时间的,基于计数器的,因为用户可能会瞎生成,然后导致服务端计数器和本地计数器不一致,这时候,就需要服务器累计重试,不过这个重试一般来说是有限制是,瞎按次数过多之后,需要用户重新输入几次序列,然后重新同步计数器,基于时间的呢,一般来说基于客户端和服务端时间不能相差过大,如果差异过大,就需要重新同步,这个一次密码虽然只有6位,但是加入重试次数限制的话,想要暴力破解的难度还是非常大的,主要使用的时候,一定要加上限制,好了,本文到这里就结束了,本人水平有限,如有错误,欢迎大佬们指出,谢谢。
参考资料
-
https://en.wikipedia.org/wiki/One-time_password[1] -
https://appleinsider.com/inside/ios/tips/how-to-use-google-authenticator-on-iphone-and-ipad[2] -
https://www.ietf.org/rfc/rfc4226.txt[3] -
https://www.rfc-editor.org/rfc/rfc6238[4] -
https://medium.com/starbugs/totp-2fa-algorithm-in-10-mins-25acc3c35df9[5]
Reference
https://en.wikipedia.org/wiki/One-time_password: https://en.wikipedia.org/wiki/One-time_password
[2]https://appleinsider.com/inside/ios/tips/how-to-use-google-authenticator-on-iphone-and-ipad: https://appleinsider.com/inside/ios/tips/how-to-use-google-authenticator-on-iphone-and-ipad
[3]https://www.ietf.org/rfc/rfc4226.txt: https://www.ietf.org/rfc/rfc4226.txt
[4]https://www.rfc-editor.org/rfc/rfc6238: https://www.rfc-editor.org/rfc/rfc6238
[5]https://medium.com/starbugs/totp-2fa-algorithm-in-10-mins-25acc3c35df9: https://medium.com/starbugs/totp-2fa-algorithm-in-10-mins-25acc3c35df9
原文始发于微信公众号(Coder小Q):OTP基本原理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论