一次性密码(OTP)示例
本节将通过一个示例说明如何在 Python 中生成并验证一次性密码(OTP)。这里选用的 Python 库是 PyOTP,它实现了 RFC 4226 和 RFC 6238 标准。使用这个库时,应当遵循这些标准中的要求。安装命令如下:
pip install pyotp
服务端设置
我们需要创建一个 base32 秘密值,供身份验证服务器和客户端共享。这里使用 Google Authenticator 开源项目的 OTP 模型;该模型通过 URI 在客户端与服务器之间交换秘密值及其他信息,URI 中包含共享秘密值、客户端用户名和签发方名称。
import pyotp
base32secret = pyotp.random_base32()
print('Secret:', base32secret)
totp_uri = pyotp.totp.TOTP(base32secret).provisioning_uri(
"alice@google.com",
issuer_name="Secure App")
print(totp_uri)
运行上述代码示例:https://repl.it/@nakov/OTP-Server-Side-in-Python。
输出示例:
Secret: S3K3TPI5MYA2M67V
otpauth://totp/Secure%20App:alice%40google.com?secret=S3K3TPI5MYA2M67V&issuer=Secure%20App
客户端设置
客户端安全存储秘密值后,默认每 30 秒生成一个新代码。
import pyotp
import time
base32secret = 'S3K3TPI5MYA2M67V'
print('Secret:', base32secret)
totp = pyotp.TOTP(base32secret)
print('OTP code:', totp.now())
time.sleep(30)
print('OTP code:', totp.now())
运行上述代码示例:https://repl.it/@nakov/OTP-Client-Side-in-Python。
输出示例:
Secret: S3K3TPI5MYA2M67V
OTP code: 339838
OTP code: 284911
可运行的示例
你可以从 Google Play 或 App Store 安装 Google Authenticator,然后扫描下面的二维码:

验证检查示例:
import pyotp
base32secret = 'S3K3TPI5MYA2M67V'
print('Secret:', base32secret)
totp = pyotp.TOTP(base32secret)
your_code = '123456'
print(totp.verify('Code Valid:', your_code))
运行上述代码示例:https://repl.it/@nakov/QR-code-scanner-in-Python。
输出:
Secret: S3K3TPI5MYA2M67V
Code Valid: True