跳转至

2af动态密码

python 实现的动态密码

基本概念

共享密钥(Secret Key): TOTP算法基于一个共享的密钥,该密钥在服务提供商和用户设备之间进行共享。这个密钥用于生成和验证验证码。

时间戳(Timestamp): TOTP算法使用时间戳作为输入之一。时间戳通常表示为从某个特定时间点(例如UNIX纪元)开始经过的秒数。

哈希函数(Hash Function): TOTP算法使用哈希函数对共享密钥和时间戳的组合进行哈希运算,以生成验证码。

时间步长(Time Step): TOTP算法中的时间步长定义了验证码的变化频率。在实践中,常用的步长是30秒或60秒。

标准工作原理

1、生成密钥(Secret Key): 服务提供商生成一个随机的密钥,并将其与用户设备共享。

2、相同的算法(服务商、用户)生成验证码(One-Time Password,OTP):默认sha1算法,一般有算法,如sha256、sha512、gost34.11.256 等。

    首先,计算当前时间戳除以时间步长(Step Size)的余数,以确定当前时间窗口。
    使用当前时间窗口的时间戳和共享密钥作为输入,通过哈希函数生成验证码。
    哈希函数的输出通常是一个固定长度的哈希值,然后从中提取一段数字作为验证码。

3、验证验证码:

用户提供其设备生成的验证码。发送给服务商。
如果服务器生成的验证码与用户提供的验证码相匹配,则验证成功。

我的使用

密钥仅仅保留在系统、当用户执行某些 通过 GET 操作向系统提交表单时,表单里自动附加一份2AF验证码。

即可简单保障 get 请求的安全性,

下方简单演示了如何使用 pyotp 库生成2AF密钥和验证码,以及验证过程

pyotp
import pyotp

def verify_2af():
    # 生成一个2AF密钥
    secret = pyotp.random_base32(64)
    # 生成一个基于密钥的2AF验证码,设置有效时长60秒
    totp = pyotp.TOTP(secret,interval=60)

    # 对应的验证码
    code = totp.now()
    print(f"Code: {code}\nsecret: {secret}\n")
    # 模拟验证过程
    user_input = input("输入验证码: ")
    if totp.verify(user_input):
        print("2AF Code is 有效.")
    else:
        print("2AF Code is 无效.")


if __name__ == "__main__":
    verify_2af()