一次性密码(OTP)示例

本节将通过一个示例说明如何在 Python 中生成并验证一次性密码(OTP)。这里选用的 Python 库是 PyOTP,它实现了 RFC 4226RFC 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 PlayApp Store 安装 Google Authenticator,然后扫描下面的二维码:

OTP 身份验证

验证检查示例:

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

results matching ""

    No results matching ""