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

 更新时间:2022年07月08日 09:36:44   作者:somenzz  
双因素认证(2FA)作为额外安全层为账号登录添加了第二层身份验证。确保账号持有人是可以访问数字身份的唯-用户。如果不使用双因表认证,企业将承担巨大的安全风险。本文将用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 秒可以自定义),也会失效:

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

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

hotp = pyotp.HOTP('base32secret3232')
hotp.at(0) # => '260182'
hotp.at(1) # => '055283'
hotp.at(1401) # => '316439'

# OTP verified with a counter
hotp.verify('316439', 1401) # => True
hotp.verify('316439', 1402) # => 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策略,双因索认证更像为补充完整解决方案的最终安全层。

双因素认证的使用场景

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

到此这篇关于Python实现双因素验证2FA的示例代码的文章就介绍到这了,更多相关Python双因素验证2FA内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python redis 批量设置过期key过程解析

    python redis 批量设置过期key过程解析

    这篇文章主要介绍了python redis 批量设置过期key过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • python实现每次处理一个字符的三种方法

    python实现每次处理一个字符的三种方法

    这篇文章主要介绍了python实现每次处理一个字符的三种方法,是非常实用的字符串操作技巧,需要的朋友可以参考下
    2014-10-10
  • Python面向对象之模块详解

    Python面向对象之模块详解

    这篇文章主要为大家介绍了Python面向对象之模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 基于python计算并显示日间、星期客流高峰

    基于python计算并显示日间、星期客流高峰

    这篇文章主要介绍了基于python显示日间、星期客流高峰,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python项目文件中安装 setup.py的步骤

    Python项目文件中安装 setup.py的步骤

    大家都知道setup.py是python模块分发与安装的指导文件,这篇文章主要介绍了Python项目文件中如何安装 setup.py,需要的朋友可以参考下
    2023-05-05
  • Pytorch中torch.unsqueeze()与torch.squeeze()函数详细解析

    Pytorch中torch.unsqueeze()与torch.squeeze()函数详细解析

    torch.squeeze()这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,下面这篇文章主要给大家介绍了关于Pytorch中torch.unsqueeze()与torch.squeeze()函数详细的相关资料,需要的朋友可以参考下
    2023-02-02
  • python密码学换位密码及换位解密转置加密教程

    python密码学换位密码及换位解密转置加密教程

    这篇文章主要为大家介绍了python密码学换位密码及换位解密转置加密教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • pyqt5自定义信号实例解析

    pyqt5自定义信号实例解析

    这篇文章主要介绍了pyqt5自定义信号实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python中使用item()方法遍历字典的例子

    Python中使用item()方法遍历字典的例子

    这篇文章主要介绍了Python中使用item()方法遍历字典的例子,for...in这种是Python中最常用的遍历字典的方法了,需要的朋友可以参考下
    2014-08-08
  • Python3.5常见内置方法参数用法实例详解

    Python3.5常见内置方法参数用法实例详解

    这篇文章主要介绍了Python3.5常见内置方法参数用法,结合实例形式详细分析了Python常见的内置方法及参数使用技巧,需要的朋友可以参考下
    2019-04-04

最新评论