介绍
传统的用户名密码方式,容易泄漏,并不安全。
你说,加上短信验证码不就安全了,其实短信验证码也是不安全的,容易被拦截和伪造,SIM 卡也可以克隆,已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。
因此就有了 Two-factor authentication,简称 2FA,也就是双因素验证。最常见的就是用户名密码,再加一个动态码。动态码通常由随身携带的移动设备上生成,比如 U 盾、手机。
动态码最常见的实现算法就是 One-Time Password(OTP),是基于时间的一次性密码,它是公认的可靠解决方案,已经写入国际标准 RFC6238。比如我们最常用的 Google Authenticator,就是 OTP。
那么,知道了 2FA,接下来应该考虑的事,就是如何让你用 Python 写的网站实现 2FA。
轮子其实已经有了,那就是 PyOTP,结合自己的理解,分享一下它的用法。
1.安装
pip 安装,不多说。
1
|
pip install pyotp |
2.配对
配对就是移动设备和我们的 web 服务器配对。
首先,在服务器上使用如下代码生成一次性密钥:
1
2
3
4
|
>>> import pyotp >>> pyotp.random_base32() 'BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2' >>> |
然后将这个密钥以二维码的形式让手机(移动设备)扫描,扫描之后,手机上的应用就保存了这个密钥。
3.验证
接下来,在手机上就可以使用下面这段逻辑产生动态密码了。
1
2
3
4
|
>>> totp = pyotp.TOTP( 'BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2' ) >>> totp.now() '941782' >>> |
现在,你有 30 秒的时间将这个 6 位数密码提交到服务器(输入到网页上),服务器服务器也使用同样的密钥和当前时间戳,生成一个动态码,跟用户提交的动态码比对。只要两者不一致,就验证失败,也就是下面这段逻辑,如果超过 30 秒,(当然,30 秒可以自定义),也会失效:
1
2
3
4
5
6
|
>>> totp = pyotp.TOTP( 'BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2' ) >>> totp.verify( '941782' ) True >>> time.sleep( 30 ) >>> totp.verify( '941782' ) False |
除了使用基于时间的动态密码,也可以用基于计数的动态密码,逻辑如下:
1
2
3
4
5
6
7
8
|
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 产生的是一致的:
1
2
3
|
import pyotp totp = pyotp.TOTP( "JBSWY3DPEHPK3PXP" ) print ( "Current OTP:" , totp.now()) |
其实二维码的信息就是 JBSWY3DPEHPK3PXP。
这样,我们用 Google Authenticator 来产生动态密码,网站上进行二次验证,就可以实现 2FA 了。
到此这篇关于Python实现双因素验证2FA的示例代码的文章就介绍到这了,更多相关Python双因素验证2FA内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://mp.weixin.qq.com/s/gS_pD221a7r5LT3rEtX5zw