OTP基本原理

admin 2024年11月11日22:55:18评论54 views字数 2618阅读8分43秒阅读模式

OTP基本原理

OTP基本原理

本篇文章呢,我们一起来看一下有关于OTP用到的一些密码学知识,那么什么是OTP这个名词可能读者有可能不了解,但是相信大家可能都见过或者用过多因子认证这个东西吧。

OTP基本原理
Google Authenticator(图片来自互联网)

那么,作为一个客户端,怎么能保证和服务端生成的这个6位的随机密码一致呢,本文来看下OTP的相关知识。

定义

一次性密码(One-Time Password, 「OTP」), 是指计算机系统或其他数字设备上只能使用一次的密码,有效期为只有一次登录会话或交易。OTP的产生方式,主要是以时间差做为服务器与密代码生成器的同步条件。在需要登录的时候,就利用密代码生成器产生动态密码,OTP一般分为计次使用以及计时使用两种,计次使用的OTP产出后,可在不限时间内使用;计时使用的OTP则可设置密码有效时间,从30秒到两分钟不等[1而OTP在进行认证之后即废弃不用,下次认证必须使用新的密码。接下来我们分别来看一下这两种方式产生的一次密码。

HOTP

基于HMAC的一次性密码算法(HMAC-based One-time Password algorithm,「HOTP」)是一种基于散列消息验证码(HMAC)的一次性密码(OTP)算法。

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

[1]

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基本原理

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月11日22:55:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   OTP基本原理https://cn-sec.com/archives/1826408.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息