Two-factor authentication
双重验证
import time
from cryptography.hazmat.primitives.twofactor.hotp import HOTP
from cryptography.hazmat.primitives.hashes import SHA1
from cryptography.hazmat.primitives.twofactor.totp import TOTP
from cryptography.hazmat.primitives.hashes import SHA1
两步验证 计数器
这是 RFC 4226
的实现
import os
from cryptography.hazmat.primitives.twofactor.hotp import HOTP
from cryptography.hazmat.primitives.hashes import SHA1
key = os.urandom(20) # 至少是128位, 建议密钥为160位
hotp = HOTP(key, 6, SHA1()) # >= 6和<= 8
# 生成一次性密码值 第一个参数为次数
hotp_value = hotp.generate(0)
# 认证是否正确 第二个参数为次数
hotp.verify(b'值', 0)
两步验证 时间
这是 RFC 6238
的实现
使用时间生成一次性密码值
import os
import time
from cryptography.hazmat.primitives.twofactor.totp import TOTP
from cryptography.hazmat.primitives.hashes import SHA1
key = os.urandom(20) # 至少是128位, 建议密钥为160位
totp = TOTP(key, 8, SHA1(), 30) # >= 6和<= 8
time_value = int(time.time())
# 生成一次性密码值
totp_value = totp.generate(time_value)
# 认证是否正确
totp.verify(totp_value, time_value)
---------------------------------------------------- 两步验证 时间间隔
密钥
key = os.urandom(20)
8代表长度 30代表时间间隔单位为秒
totp = TOTP(key, 8, SHA1(), 30)
当前时间
time_value = time.time()
返回一次性密码值
totp_value = totp.generate(time_value)
认证是否正确 totp_value一次性密码值
totp.verify(totp_value, time_value)
输出长度必须 >=6且<=8 key 每个用户的密钥。该值必须保密并且至少为 128位。建议密钥为 160 位。