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內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: