Python實(shí)現(xiàn)雙因素驗(yàn)證2FA的示例代碼
介紹
傳統(tǒng)的用戶名密碼方式,容易泄漏,并不安全。
你說(shuō),加上短信驗(yàn)證碼不就安全了,其實(shí)短信驗(yàn)證碼也是不安全的,容易被攔截和偽造,SIM 卡也可以克隆,已經(jīng)有案例,先偽造身份證,再申請(qǐng)一模一樣的手機(jī)號(hào)碼,把錢(qián)轉(zhuǎn)走。
因此就有了 Two-factor authentication,簡(jiǎn)稱(chēng) 2FA,也就是雙因素驗(yàn)證。最常見(jiàn)的就是用戶名密碼,再加一個(gè)動(dòng)態(tài)碼。動(dòng)態(tài)碼通常由隨身攜帶的移動(dòng)設(shè)備上生成,比如 U 盾、手機(jī)。
動(dòng)態(tài)碼最常見(jiàn)的實(shí)現(xiàn)算法就是 One-Time Password(OTP),是基于時(shí)間的一次性密碼,它是公認(rèn)的可靠解決方案,已經(jīng)寫(xiě)入國(guó)際標(biāo)準(zhǔn) RFC6238。比如我們最常用的 Google Authenticator,就是 OTP。
那么,知道了 2FA,接下來(lái)應(yīng)該考慮的事,就是如何讓你用 Python 寫(xiě)的網(wǎng)站實(shí)現(xiàn) 2FA。
輪子其實(shí)已經(jīng)有了,那就是 PyOTP,結(jié)合自己的理解,分享一下它的用法。
1.安裝
pip 安裝,不多說(shuō)。
pip install pyotp
2.配對(duì)
配對(duì)就是移動(dòng)設(shè)備和我們的 web 服務(wù)器配對(duì)。
首先,在服務(wù)器上使用如下代碼生成一次性密鑰:
>>> import pyotp >>> pyotp.random_base32() 'BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2' >>>
然后將這個(gè)密鑰以二維碼的形式讓手機(jī)(移動(dòng)設(shè)備)掃描,掃描之后,手機(jī)上的應(yīng)用就保存了這個(gè)密鑰。
3.驗(yàn)證
接下來(lái),在手機(jī)上就可以使用下面這段邏輯產(chǎn)生動(dòng)態(tài)密碼了。
>>> totp = pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2')
>>> totp.now()
'941782'
>>>現(xiàn)在,你有 30 秒的時(shí)間將這個(gè) 6 位數(shù)密碼提交到服務(wù)器(輸入到網(wǎng)頁(yè)上),服務(wù)器服務(wù)器也使用同樣的密鑰和當(dāng)前時(shí)間戳,生成一個(gè)動(dòng)態(tài)碼,跟用戶提交的動(dòng)態(tài)碼比對(duì)。只要兩者不一致,就驗(yàn)證失敗,也就是下面這段邏輯,如果超過(guò) 30 秒,(當(dāng)然,30 秒可以自定義),也會(huì)失效:
>>> totp = pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2')
>>> totp.verify('941782')
True
>>> time.sleep(30)
>>> totp.verify('941782')
False除了使用基于時(shí)間的動(dòng)態(tài)密碼,也可以用基于計(jì)數(shù)的動(dòng)態(tài)密碼,邏輯如下:
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) # => False4.那是不是手機(jī)上還有開(kāi)發(fā)個(gè) app
不用,我們直接使用現(xiàn)成的 Google Authenticator 就可以了。
如果你已安裝了 Google Authenticator,請(qǐng)點(diǎn)擊 :heavy_plus_sign: 添加密鑰,然后掃描下發(fā)的二維碼,就可以生成動(dòng)態(tài)碼:

然后你可以執(zhí)行下面這段代碼,就可以發(fā)現(xiàn) pyotp 產(chǎn)生的動(dòng)態(tài)碼和 Google Authenticator 產(chǎn)生的是一致的:
import pyotp
totp = pyotp.TOTP("JBSWY3DPEHPK3PXP")
print("Current OTP:", totp.now())其實(shí)二維碼的信息就是 JBSWY3DPEHPK3PXP。
這樣,我們用 Google Authenticator 來(lái)產(chǎn)生動(dòng)態(tài)密碼,網(wǎng)站上進(jìn)行二次驗(yàn)證,就可以實(shí)現(xiàn) 2FA 了。
知識(shí)點(diǎn)補(bǔ)充
雙因素認(rèn)證的含義及工作原理
雙因素認(rèn)證是-種賬號(hào)驗(yàn)證過(guò)程,顧名思義,除用戶名和密碼之外還需要第二因素核驗(yàn)用戶的登錄憑證。第二因素很難被網(wǎng)絡(luò)不法分子復(fù)制,例如個(gè)人安全問(wèn)題戲發(fā)送到個(gè)人安全設(shè)備上的動(dòng)態(tài)密碼。
雙因索認(rèn)證的步驟根據(jù)所選驗(yàn)證因素略有不同,比如設(shè)置成個(gè)人安全問(wèn)題可能要回答母親的婚前姓氏,或兒時(shí)居住的街道名稱(chēng)等,設(shè)置成動(dòng)態(tài)密碼就需要在登錄界面輸入發(fā)送到用戶移動(dòng)設(shè)備上的臨時(shí)登錄密碼。但無(wú)論設(shè)置哪種第二因素,都要求用戶在輸入用戶名和密碼后提供額外的安全提示。
對(duì)于最高級(jí)別的訪問(wèn)管理,大多數(shù)雙因素認(rèn)證工具會(huì)要求用戶每次登錄都出示安全提示。
雙因素認(rèn)證在身份和訪問(wèn)管理中的作用
身份和訪問(wèn)管理(IAM) 是企業(yè)用來(lái)控制對(duì)IT資源和設(shè)備的訪問(wèn)權(quán)限及訪問(wèn)許可級(jí)別的總體策略。多因素認(rèn)證(MFA) 也屬于IAM,但雙因索認(rèn)證本身并不是完整的IAM安全解決方案。比起IAM策略,雙因索認(rèn)證更像為補(bǔ)充完整解決方案的最終安全層。
雙因素認(rèn)證的使用場(chǎng)景
簡(jiǎn)單來(lái)說(shuō),雙因索認(rèn)證用于保護(hù)業(yè)務(wù)系統(tǒng)賬號(hào),否則業(yè)務(wù)系統(tǒng)很容易遭遇賬號(hào)接管攻擊。最終導(dǎo)致大規(guī)模的數(shù)據(jù)泄露。
到此這篇關(guān)于Python實(shí)現(xiàn)雙因素驗(yàn)證2FA的示例代碼的文章就介紹到這了,更多相關(guān)Python雙因素驗(yàn)證2FA內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Django寫(xiě)天氣預(yù)報(bào)查詢網(wǎng)站
今天小編就為大家分享一篇關(guān)于用Django寫(xiě)天氣預(yù)報(bào)查詢網(wǎng)站的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Python打印詳細(xì)報(bào)錯(cuò)日志,獲取報(bào)錯(cuò)信息位置行數(shù)方式
這篇文章主要介紹了Python打印詳細(xì)報(bào)錯(cuò)日志,獲取報(bào)錯(cuò)信息位置行數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
PyTorch詳解經(jīng)典網(wǎng)絡(luò)ResNet實(shí)現(xiàn)流程
ResNet全稱(chēng)residual neural network,主要是解決過(guò)深的網(wǎng)絡(luò)帶來(lái)的梯度彌散,梯度爆炸,網(wǎng)絡(luò)退化(即網(wǎng)絡(luò)層數(shù)越深時(shí),在數(shù)據(jù)集上表現(xiàn)的性能卻越差)的問(wèn)題2022-05-05
完美解決Python 2.7不能正常使用pip install的問(wèn)題
今天小編就為大家分享一篇完美解決Python 2.7不能正常使用pip install的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python 寫(xiě)入訓(xùn)練日志文件并控制臺(tái)輸出解析
這篇文章主要介紹了Python 寫(xiě)入訓(xùn)練日志文件并控制臺(tái)輸出解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
python PyAutoGUI 模擬鼠標(biāo)鍵盤(pán)操作和截屏功能
一款跨平臺(tái)/無(wú)依賴(lài)的自動(dòng)化測(cè)試工具,目測(cè)只能控制鼠標(biāo)/鍵盤(pán)/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標(biāo)鍵盤(pán)操作和截屏功能,需要的朋友可以參考下2019-08-08
python根據(jù)時(shí)間生成mongodb的ObjectId的方法
這篇文章主要介紹了python根據(jù)時(shí)間生成mongodb的ObjectId的方法,涉及Python操作mongodb數(shù)據(jù)庫(kù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
終端命令查看TensorFlow版本號(hào)及路徑的方法
今天小編就為大家分享一篇終端命令查看TensorFlow版本號(hào)及路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python腳本使用阿里云slb對(duì)惡意攻擊進(jìn)行封堵的實(shí)現(xiàn)
這篇文章主要介紹了python腳本使用阿里云slb對(duì)惡意攻擊進(jìn)行封堵的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

