0

生成一次性密码(具有 N 个符号长度的短信密码)的最简单方法是什么passlib

我现在如何创建它:

from secrets import randbelow as secrets_randbelow


def create_secret_code() -> str:  # TODO use OTP
    secret_code = "".join([str(secrets_randbelow(exclusive_upper_bound=10)) for _ in range(config.SECRET_CODE_LEN)])
    print_on_stage(secret_code=secret_code)
    return secret_code

显然,它需要检查生成的代码是否已经不在使用中(例如 - 通过 Redis 生成)。

我的代码中也已经有一个passlib对象来散列和验证密码

from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

我找到了这个类,但不知道如何生成具有 N 个符号长度的短信密码

PS我添加了一个fastapi标签,因为我正在使用fastapi并且passlib被用作它的标准加密工具,文档

4

1 回答 1

0

您可以使用令牌所需的位数初始化 TOTP 类,如下所示:

TOTP(digits=10)

这是一个完整的示例,使用您的config.SECRET_CODE_LEN

from passlib.totp import TOTP
otp = TOTP('s3jdvb7qd2r7jpxx', digits=config.SECRET_CODE_LEN)
token = otp.generate()
print(token.token)
于 2021-06-09T07:40:12.740 回答