Python實現(xiàn)雙因素驗證2FA的示例代碼
介紹
傳統(tǒng)的用戶名密碼方式,容易泄漏,并不安全。
你說,加上短信驗證碼不就安全了,其實短信驗證碼也是不安全的,容易被攔截和偽造,SIM 卡也可以克隆,已經(jīng)有案例,先偽造身份證,再申請一模一樣的手機號碼,把錢轉(zhuǎn)走。
因此就有了 Two-factor authentication,簡稱 2FA,也就是雙因素驗證。最常見的就是用戶名密碼,再加一個動態(tài)碼。動態(tài)碼通常由隨身攜帶的移動設備上生成,比如 U 盾、手機。
動態(tài)碼最常見的實現(xiàn)算法就是 One-Time Password(OTP),是基于時間的一次性密碼,它是公認的可靠解決方案,已經(jīng)寫入國際標準 RFC6238。比如我們最常用的 Google Authenticator,就是 OTP。
那么,知道了 2FA,接下來應該考慮的事,就是如何讓你用 Python 寫的網(wǎng)站實現(xiàn) 2FA。
輪子其實已經(jīng)有了,那就是 PyOTP,結合自己的理解,分享一下它的用法。
1.安裝
pip 安裝,不多說。
pip install pyotp
2.配對
配對就是移動設備和我們的 web 服務器配對。
首先,在服務器上使用如下代碼生成一次性密鑰:
>>> import pyotp >>> pyotp.random_base32() 'BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2' >>>
然后將這個密鑰以二維碼的形式讓手機(移動設備)掃描,掃描之后,手機上的應用就保存了這個密鑰。
3.驗證
接下來,在手機上就可以使用下面這段邏輯產(chǎn)生動態(tài)密碼了。
>>> totp = pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2') >>> totp.now() '941782' >>>
現(xiàn)在,你有 30 秒的時間將這個 6 位數(shù)密碼提交到服務器(輸入到網(wǎng)頁上),服務器服務器也使用同樣的密鑰和當前時間戳,生成一個動態(tài)碼,跟用戶提交的動態(tài)碼比對。只要兩者不一致,就驗證失敗,也就是下面這段邏輯,如果超過 30 秒,(當然,30 秒可以自定義),也會失效:
>>> totp = pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2') >>> totp.verify('941782') True >>> time.sleep(30) >>> totp.verify('941782') False
除了使用基于時間的動態(tài)密碼,也可以用基于計數(shù)的動態(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) # => False
4.那是不是手機上還有開發(fā)個 app
不用,我們直接使用現(xiàn)成的 Google Authenticator 就可以了。
如果你已安裝了 Google Authenticator,請點擊 :heavy_plus_sign: 添加密鑰,然后掃描下發(fā)的二維碼,就可以生成動態(tài)碼:
然后你可以執(zhí)行下面這段代碼,就可以發(fā)現(xiàn) pyotp 產(chǎn)生的動態(tài)碼和 Google Authenticator 產(chǎn)生的是一致的:
import pyotp totp = pyotp.TOTP("JBSWY3DPEHPK3PXP") print("Current OTP:", totp.now())
其實二維碼的信息就是 JBSWY3DPEHPK3PXP。
這樣,我們用 Google Authenticator 來產(chǎn)生動態(tài)密碼,網(wǎng)站上進行二次驗證,就可以實現(xiàn) 2FA 了。
知識點補充
雙因素認證的含義及工作原理
雙因素認證是-種賬號驗證過程,顧名思義,除用戶名和密碼之外還需要第二因素核驗用戶的登錄憑證。第二因素很難被網(wǎng)絡不法分子復制,例如個人安全問題戲發(fā)送到個人安全設備上的動態(tài)密碼。
雙因索認證的步驟根據(jù)所選驗證因素略有不同,比如設置成個人安全問題可能要回答母親的婚前姓氏,或兒時居住的街道名稱等,設置成動態(tài)密碼就需要在登錄界面輸入發(fā)送到用戶移動設備上的臨時登錄密碼。但無論設置哪種第二因素,都要求用戶在輸入用戶名和密碼后提供額外的安全提示。
對于最高級別的訪問管理,大多數(shù)雙因素認證工具會要求用戶每次登錄都出示安全提示。
雙因素認證在身份和訪問管理中的作用
身份和訪問管理(IAM) 是企業(yè)用來控制對IT資源和設備的訪問權限及訪問許可級別的總體策略。多因素認證(MFA) 也屬于IAM,但雙因索認證本身并不是完整的IAM安全解決方案。比起IAM策略,雙因索認證更像為補充完整解決方案的最終安全層。
雙因素認證的使用場景
簡單來說,雙因索認證用于保護業(yè)務系統(tǒng)賬號,否則業(yè)務系統(tǒng)很容易遭遇賬號接管攻擊。最終導致大規(guī)模的數(shù)據(jù)泄露。
到此這篇關于Python實現(xiàn)雙因素驗證2FA的示例代碼的文章就介紹到這了,更多相關Python雙因素驗證2FA內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python打印詳細報錯日志,獲取報錯信息位置行數(shù)方式
這篇文章主要介紹了Python打印詳細報錯日志,獲取報錯信息位置行數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09PyTorch詳解經(jīng)典網(wǎng)絡ResNet實現(xiàn)流程
ResNet全稱residual neural network,主要是解決過深的網(wǎng)絡帶來的梯度彌散,梯度爆炸,網(wǎng)絡退化(即網(wǎng)絡層數(shù)越深時,在數(shù)據(jù)集上表現(xiàn)的性能卻越差)的問題2022-05-05完美解決Python 2.7不能正常使用pip install的問題
今天小編就為大家分享一篇完美解決Python 2.7不能正常使用pip install的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python PyAutoGUI 模擬鼠標鍵盤操作和截屏功能
一款跨平臺/無依賴的自動化測試工具,目測只能控制鼠標/鍵盤/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標鍵盤操作和截屏功能,需要的朋友可以參考下2019-08-08python根據(jù)時間生成mongodb的ObjectId的方法
這篇文章主要介紹了python根據(jù)時間生成mongodb的ObjectId的方法,涉及Python操作mongodb數(shù)據(jù)庫的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03python腳本使用阿里云slb對惡意攻擊進行封堵的實現(xiàn)
這篇文章主要介紹了python腳本使用阿里云slb對惡意攻擊進行封堵的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02