Python OTP实现多因子认证Google Authenticator及生成二维码

介绍


双因子认证(Two-factor authentication,也叫2FA),是一种通过组合两种不同的验证方式进行用户身份验证的机制。Google在2011年3月份,宣布在线上使用双因子认证,MSN和Yahoo紧随其后。

OTP 是 One-Time Password的简写,表示一次性密码。分为以下两种

HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性密码。

HOTP 是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过HASH算法运算出一致的密码。RFC4226。

TOTP 是Time-based One-Time Password的简写,表示基于时间戳算法的一次性密码。

TOTP 是时间同步,基于客户端的动态口令和动态口令验证服务器的时间比对,一般每60秒产生一个新口令,要求客户端和服务器能够十分精确的保持正确的时钟,客户端和服务端基于时间计算的动态口令才能一致。 RFC6238。

双因子认证,除了需要验证用户名密码外,还要结合另外一种实物设备,如Rsa令牌,或者手机。
双因子认证的产品大致可以分成两类:

  • 可以产生token的硬件设备
  • 智能手机的app

手机短信验证码,登录微信公众号时的扫码确认都可以称为双因子认证。本文只介绍OTP一次性密码,也经常被称为token。

原理


在这里插入图片描述

动态密码的产生方式,主要是以时间差做为服务器与密码产生器的同步条件。在需要登录的时候,就利用密码产生器产生动态密码,OTP一般分为计次使用以及计时使用两种,计次使用的OTP产出后,可在不限时间内使用;计时使用的OTP则可设置密码有效时间,从30秒到两分钟不等,而OTP在进行认证之后即废弃不用,下次认证必须使用新的密码,增加了试图不经授权访问有限制资源的难度。

使用Python实现OTP功能


目前Python上有以下两大模块比较流行,以第一个pyotp为例介绍比较常用的TOTP

pyotp就是一个python模块,可以直接使用pip安装

pip install pyotp

生成密钥


import base64
string='www.code404.icu'
secretKey = base64.b32encode(string.encode(encoding="utf-8"))
print(secretKey)
b'O53XOLTDN5SGKNBQGQ======'

生成口令


import pyotp
totp=pyotp.TOTP(secretKey)
print(totp.now())
857020

生成二维码


使用 python 模块 qrcode

pip install qrcode
url=pyotp.totp.TOTP(secretKey).provisioning_uri("lihe@code404.icu",issuer_name='码404')
img=qrcode.make(url)
print(url)
with open('code404_qrcode.png','wb') as f:
    img.save(f)

绑定手机APP Google身份验证器
使用APP扫 刚才生成的二维码
在这里插入图片描述

验证口令


import base64
import pyotp
string='www.code404'
secretKey=base64.b32encode(string.encode(encoding='utf-8'))
print(secretKey)
totp=pyotp.TOTP(secretKey)
print(totp.verify(276269))
True

版权声明:本文为作者原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原创文章,作者:老C,如若转载,请注明出处:https://www.code404.icu/1205.html

发表评论

登录后才能评论