# Python实现双因素验证2FA的示例代码

> 作者/来源: UCloud 运营管理员
> 发布时间: 2022-10-17T07:32:00.000Z
> 分类: 解决方案
> 标签: 网络, 安全, Python
> 原文链接: http://117.50.162.249:3000/yun/articles/2322

---

# Python实现双因素验证2FA的示例代码

> 来源: https://www.ucloud.cn/yun/128060.html
> 作者: 89542767
> 发布日期: 发布于2022-10-17 15:32

小编写这篇文章的目的，主要是给大家讲解Python的一些内容，比如Python实现双因素验证2FA的示例代码，那么，具体的代码是什么呢？下面就给大家详细解答下。

**介绍**

　　传统的用户名密码方式，容易泄漏，并不安全。

　　你说，加上短信验证码不就安全了，其实短信验证码也是不安全的，容易被拦截和伪造，SIM卡也可以克隆，已经有案例，先伪造身份证，再申请一模一样的手机号码，把钱转走。

　　因此就有了Two-factor authentication，简称2FA，也就是双因素验证。最常见的就是用户名密码，再加一个动态码。动态码通常由随身携带的移动设备上生成，比如U盾、手机。

　　动态码最常见的实现算法就是One-Time Password（OTP），是基于时间的一次性密码，它是公认的可靠解决方案，已经写入国际标准RFC6238。比如我们最常用的Google Authenticator，就是OTP。

　　那么，知道了2FA，接下来应该考虑的事，就是如何让你用Python写的网站实现2FA。

　　轮子其实已经有了，那就是PyOTP，结合自己的理解，分享一下它的用法。

**1.安装**

　　pip安装，不多说。

```
　　pip install pyotp
```

**2.配对**

　　配对就是移动设备和我们的web服务器配对。

　　首先，在服务器上使用如下代码生成一次性密钥：

```
　   import pyotp
　   pyotp.random_base32()
　  　'BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2'
```

　　然后将这个密钥以二维码的形式让手机（移动设备）扫描，扫描之后，手机上的应用就保存了这个密钥。

**3.验证**

　　接下来，在手机上就可以使用下面这段逻辑产生动态密码了。

```
　　totp=pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2')
　　totp.now()
　　'941782'
```

　　现在，你有30秒的时间将这个6位数密码提交到服务器（输入到网页上），服务器服务器也使用同样的密钥和当前时间戳，生成一个动态码，跟用户提交的动态码比对。只要两者不一致，就验证失败，也就是下面这段逻辑，如果超过30秒，（当然，30秒可以自定义），也会失效：

```
　　=pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2')
　　totp.verify('941782')
　　True
　　time.sleep(30)
　　totp.verify('941782')
　　False
　　totp=pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2')
　　totp.verify('941782')
　　True
　　time.sleep(30)
　　totp.verify('941782')
　　False
```

　　除了使用基于时间的动态密码，也可以用基于计数的动态密码，逻辑如下：

```
　　hotp=pyotp.HOTP('base32secret3232')
　　hotp.at(0)#=&gt;'260182'
　　hotp.at(1)#=&gt;'055283'
　　hotp.at(1401)#=&gt;'316439'
　　#OTP verified with a counter
　　hotp.verify('316439',1401)#=&gt;True
　　hotp.verify('316439',1402)#=&gt;False
```

　　4.那是不是手机上还有开发个app

　　不用，我们直接使用现成的Google Authenticator就可以了。

　　如果你已安装了Google Authenticator，请点击:heavy\_plus\_sign:添加密钥，然后扫描下发的二维码，就可以生成动态码：

　　然后你可以执行下面这段代码，就可以发现pyotp产生的动态码和Google Authenticator产生的是一致的：

```
　　import pyotp
　　totp=pyotp.TOTP("JBSWY3DPEHPK3PXP")
　　print("Current OTP:",totp.now())
```

　　其实二维码的信息就是JBSWY3DPEHPK3PXP。

　　这样，我们用Google Authenticator来产生动态密码，网站上进行二次验证，就可以实现2FA了。

　　知识点补充

　　双因素认证的含义及工作原理

　　双因素认证是-种账号验证过程，顾名思义，除用户名和密码之外还需要第二因素核验用户的登录凭证。第二因素很难被网络不法分子复制，例如个人安全问题戏发送到个人安全设备上的动态密码。

　　双因索认证的步骤根据所选验证因素略有不同，比如设置成个人安全问题可能要回答母亲的婚前姓氏，或儿时居住的街道名称等，设置成动态密码就需要在登录界面输入发送到用户移动设备上的临时登录密码。但无论设置哪种第二因素，都要求用户在输入用户名和密码后提供额外的安全提示。

　　对于最高级别的访问管理，大多数双因素认证工具会要求用户每次登录都出示安全提示。

　　双因素认证在身份和访问管理中的作用

　　身份和访问管理(IAM)是企业用来控制对IT资源和设备的访问权限及访问许可级别的总体策略。多因素认证(MFA)也属于IAM，但双因索认证本身并不是完整的IAM安全解决方案。比起IAM策略，双因索认证更像为补充完整解决方案的最终安全层。

　　双因素认证的使用场景

　　简单来说，双因索认证用于保护业务系统账号，否则业务系统很容易遭遇账号接管攻击。最终导致大规模的数据泄露。

　　到此为止，这篇文章就为大家介绍到这里了，希望可以给大家带来一定的帮助。