什么是双因素验证 2FA,如何用 Python 实现?
传统的用户名密码方式,容易泄漏,并不安全。
你说,加上短信验证码不就安全了,其实短信验证码也是不安全的,容易被拦截和伪造,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,请点击 ➕ 添加密钥,然后扫描下发的二维码,就可以生成动态码:
然后你可以执行下面这段代码,就可以发现 pyotp 产生的动态码和 Google Authenticator 产生的是一致的:
import pyotp
totp = pyotp.TOTP("JBSWY3DPEHPK3PXP")
print("Current OTP:", totp.now())
其实二维码的信息就是 JBSWY3DPEHPK3PXP。
这样,我们用 Google Authenticator 来产生动态密码,网站上进行二次验证,就可以实现 2FA 了。
最后
本文分享了什么是 2FA 以及如何用 Python 实现。如果觉得有收获,还请点「在看」分享给更多的人。如果有问题,欢迎留言讨论。新来的朋友可以关注下,可以给你提供技术支持。
相关文章
- python要不要装pycharm-Python和pyCharm安装
- 【Python矩阵转置】| 试使用多方法实现[通俗易懂]
- Python要如何实现(列表)排序?
- 这是我见过最牛逼的接口自动化测试框架没有之一:基于python+requests+pytest+allure实现
- 【说站】python库如何实现对象的转换
- 【说站】python类实例化如何实现
- 【说站】python删除元素的使用条件
- 【说站】python访问元组的两种方法
- 【说站】python PyQt5如何实现窗口功能
- 【说站】python中%如何实现格式化
- 【说站】python静态web服务器如何实现
- 简述Python特点_python优缺点
- KDD CUP99数据集预处理(Python实现)
- python上的表白代码_用Python实现表白代码
- python分段线性插值_Python实现分段线性插值
- 人生苦短,我用Python-手把手教你如何使用python写串口调试助手
- 如何用 Python 的 dataclass 和 typing 模块实现字段 tag 功能
- Python分布式任务队列Celery,Django中如何实现异步任务和定时任务
- Python 运用Paramiko实现批量巡检
- OpenAi[ChatGPT] 使用Python对接OpenAi APi 实现智能QQ机器人-学习详解篇
- AI实现代码转换,Python转Java,Java转Go不再困难?
- 使用Python+VTK实现三维模型的显示和切割(面绘制)
- Python实现的Blowfish加解密详解编程语言
- Python 实现简单 Web 服务器详解编程语言
- python在windows下实现ping操作并接收返回信息详解编程语言
- Python如何连接PostgreSQL数据库?(python连接postgresql)
- 从 Python 连接到 MySQL:实现更多强大的数据库应用(python和mysql)
- Python脚本实现Linux命令快捷控制(python执行linux命令)
- python搭建简易服务器分析与实现
- python实现360皮肤按钮控件示例
- python设置检查点简单实现代码