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

