Python實(shí)現(xiàn)TOTP動態(tài)驗(yàn)證碼和二維碼生成的示例代碼
在現(xiàn)代安全場景中,TOTP(基于時(shí)間的一次性密碼)是一種廣泛使用的雙因素認(rèn)證(2FA)機(jī)制,用于增強(qiáng)賬戶安全性。本文將介紹如何使用 Python 的 pyotp 和 qrcode 庫來實(shí)現(xiàn)動態(tài)驗(yàn)證碼的生成、驗(yàn)證以及二維碼的創(chuàng)建。
環(huán)境準(zhǔn)備
在開始之前,請確保已安裝以下庫:
- pyotp:用于生成和驗(yàn)證 TOTP。
- qrcode:用于生成二維碼。
使用以下命令安裝依賴:
pip install pyotp qrcode
實(shí)現(xiàn)步驟
1. 生成密鑰并創(chuàng)建二維碼
我們需要首先生成一個(gè)密鑰,然后利用該密鑰創(chuàng)建一個(gè)包含 TOTP URI 的二維碼。以下是實(shí)現(xiàn)代碼:
import pyotp # 導(dǎo)入 pyotp 庫,用于生成和驗(yàn)證 TOTP
import qrcode # 導(dǎo)入 qrcode 庫,用于生成二維碼
# 步驟 1:生成一個(gè)密鑰
totp = pyotp.TOTP(pyotp.random_base32()) # 隨機(jī)生成一個(gè) Base32 格式的密鑰,并創(chuàng)建 TOTP 對象
print("密鑰:", totp.secret) # 打印生成的密鑰
# 步驟 2:生成二維碼
# 根據(jù)密鑰生成一個(gè) TOTP URI,包含用戶名和服務(wù)名稱
uri = totp.provisioning_uri("example@domain.com", issuer_name="MyService")
print("URI:", uri) # 打印生成的 URI
# 使用 qrcode 庫生成二維碼并保存為圖片
qr = qrcode.make(uri) # 將 URI 轉(zhuǎn)換為二維碼對象
qr.save("totp_qr.png") # 將二維碼保存為圖片文件
print("二維碼已保存為 totp_qr.png") # 提示二維碼已保存
二維碼可以用谷歌身份驗(yàn)證器或類似工具掃描,來綁定賬戶。
2. 驗(yàn)證動態(tài)驗(yàn)證碼
在綁定賬戶后,用戶會定期生成一個(gè) 6 位動態(tài)驗(yàn)證碼。以下代碼展示如何通過密鑰驗(yàn)證用戶輸入的驗(yàn)證碼:
import pyotp # 導(dǎo)入 pyotp 庫,用于生成和驗(yàn)證 TOTP
# 從生成密鑰的腳本中獲取密鑰(假設(shè)你知道密鑰)
secret = input("請輸入密鑰:") # 提示用戶輸入之前生成的密鑰
totp = pyotp.TOTP(secret) # 使用用戶提供的密鑰創(chuàng)建 TOTP 對象
# 步驟 2:驗(yàn)證 TOTP 密碼
user_input = input("請輸入驗(yàn)證碼:") # 提示用戶輸入當(dāng)前顯示的驗(yàn)證碼
if totp.verify(user_input): # 驗(yàn)證用戶輸入的驗(yàn)證碼是否有效
print("驗(yàn)證碼正確!") # 如果驗(yàn)證碼匹配當(dāng)前時(shí)間窗口,打印提示
else:
print("驗(yàn)證碼錯(cuò)誤!") # 如果不匹配,打印錯(cuò)誤提示
核心邏輯解析
密鑰生成:pyotp.random_base32() 會生成一個(gè)符合 TOTP 標(biāo)準(zhǔn)的密鑰。
TOTP URI:provisioning_uri 方法會生成一個(gè)標(biāo)準(zhǔn)的 URI,格式如下:
otpauth://totp/{服務(wù)名稱}:{用戶名}?secret={密鑰}&issuer={服務(wù)名稱}
二維碼生成:使用 qrcode.make(uri) 將 URI 轉(zhuǎn)換為二維碼圖像,可供用戶掃描綁定。
動態(tài)驗(yàn)證碼驗(yàn)證:調(diào)用 totp.verify(驗(yàn)證碼) 方法驗(yàn)證用戶輸入是否匹配當(dāng)前時(shí)間窗口的動態(tài)密碼。
應(yīng)用場景
雙因素認(rèn)證(2FA):通過密鑰和動態(tài)驗(yàn)證碼,提供一種額外的驗(yàn)證手段。
賬戶安全加固:即使密碼泄露,攻擊者也無法在沒有 TOTP 驗(yàn)證的情況下訪問賬戶。
二維碼綁定:結(jié)合二維碼,用戶可以輕松通過掃描完成雙因素認(rèn)證的綁定。
注意事項(xiàng)
時(shí)間同步:由于 TOTP 基于時(shí)間窗口,確保服務(wù)器和客戶端的時(shí)間保持同步非常重要。
密鑰存儲:請妥善保存密鑰,避免泄露。
適配其他應(yīng)用:本文生成的 URI 和二維碼可以直接用于 Google Authenticator、Authy 等主流身份驗(yàn)證器。
總結(jié)
通過 pyotp 和 qrcode,我們能夠快速實(shí)現(xiàn) TOTP 動態(tài)驗(yàn)證碼的生成、驗(yàn)證和二維碼綁定功能。這種方案簡單高效,適用于多種需要雙因素認(rèn)證的場景。
到此這篇關(guān)于Python實(shí)現(xiàn)TOTP動態(tài)驗(yàn)證碼和二維碼生成的示例代碼的文章就介紹到這了,更多相關(guān)Python生成動態(tài)驗(yàn)證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django實(shí)現(xiàn)圖片上傳數(shù)據(jù)庫并顯示
這篇文章主要為大家詳細(xì)介紹了django實(shí)現(xiàn)圖片上傳數(shù)據(jù)庫并顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Python的條件表達(dá)式和lambda表達(dá)式實(shí)例
今天小編就為大家分享一篇Python的條件表達(dá)式和lambda表達(dá)式實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python基礎(chǔ)類繼承重寫實(shí)現(xiàn)原理解析
這篇文章主要介紹了Python基礎(chǔ)類繼承重寫實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
關(guān)于Python文本生成的Beam?Search解碼問題
這篇文章主要介紹了Python文本生成的Beam?Search解碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
查看jupyter notebook每個(gè)單元格運(yùn)行時(shí)間實(shí)例
這篇文章主要介紹了查看jupyter notebook每個(gè)單元格運(yùn)行時(shí)間實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python?selenium模擬點(diǎn)擊問題解決方案
這篇文章主要介紹了python?selenium模擬點(diǎn)擊問題,涉及到安裝谷歌瀏覽器和瀏覽器驅(qū)動的相關(guān)知識介紹,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
Python中實(shí)現(xiàn)對Timestamp和Datetime及UTC時(shí)間之間的轉(zhuǎn)換
這篇文章主要介紹了Python中實(shí)現(xiàn)對Timestamp和Datetime及UTC時(shí)間之間的轉(zhuǎn)換,例子則主要針對Ubuntu等類UNIX系統(tǒng),需要的朋友可以參考下2015-04-04

