使用OTP动态令牌认证
创作时间:
作者:
@小白创作中心
使用OTP动态令牌认证
引用
CSDN
1.
https://blog.csdn.net/weixin_44153121/article/details/143745972
OTP(一次性密码)动态令牌认证是一种增强账户安全性的技术,通过在传统用户名+密码认证的基础上,增加基于时间或计数器的一次性密码验证,有效防止账号被冒用或盗用。本文将详细介绍OTP的原理、使用方法,并提供具体的服务器端和客户端代码实现。
1、什么是OTP动态令牌认证?
OTP(One-Time Password)是一种基于共享密钥和时间戳算法的一次性密码。一般每30或60秒产生一个新口令,在客户端的动态口令和服务器的动态口令验证时,要求客户端和服务器能够保持一致的时间,计算的动态口令才能一致。
OTP算法是公开的,所以可以使用市面上任意一种支持OTP的客户端。实现OTP的算法主要有两种:
- HOTP(HMAC-Based One-Time Password Algorithm):基于 HMAC 的一次性密码。
- TOTP(Time-Based One-Time Password Algorithm):基于时间戳的一次性密码。
2、怎么使用OTP动态口令?
2.1、OTP客户端
在手机的应用商店搜索:身份验证器,建议选择微软的Authenticator;或者在微信小程序中搜索:腾讯身份验证器。
2.2、添加账号:基本原理是设置共享密钥(key),一般通过扫描二维码方式
二维码内容的格式如下:
otpauth://totp/{label}?secret={secret}&issuer={issuer}
label可以填写用户的名字,secret是经过 Base32 编码后的密钥,issuer是发行者
示例:
otpauth://totp/GitHub:monchickey?secret=EPKCRBXZHDPHOOZH&issuer=GitHub
前面的 otpauth 表示协议,totp 表示采用基于时间的一次性密码,GitHub 说明发行者是 GitHub,后面的格式就是:<用户名>?secret=<密钥 base32 值>&issuer=<发行者>。
包含中文的示例:
otpauth://totp/%E5%8…%B7%20123?secret=EPKCRBXZHDPHOOZH&issuer=%E9…%BF%9D
注:帐号对应的密钥是OTP令牌生成的唯一标识,请勿分享给他人。
2.3、打开身份验证器客户端,查看OTP动态口令
3、示例
3.1、服务器端代码
class OtpServer(object):
def __init__(self, key):
if key:
# base64.b64encode(key.encode('utf-8')).decode('utf-8')
self.key = key
else:
self.key = None
def verify(self, code):
"""
验证动态口令
"""
if self.key is None or code is None or len(code) < 0:
return False
try:
otp = pyotp.TOTP(base64.b32encode(self.key.encode('utf-8')).decode('utf-8'))
# 当前时间前后刷新周期数(验证码数),防止因网速、用户操作速度等导致的时间不一致
return otp.verify(code, valid_window=5)
except Exception as ex:
return False
def showqr(self):
"""
生成二维码,用于OTP客户端扫描方式添加账号
"""
if self.key is None:
return ''
try:
otp = pyotp.TOTP(base64.b32encode(self.key.encode('utf-8')).decode('utf-8'))
# otpauth://TYPE/LABEL?PARAMETERS
uri = otp.provisioning_uri(name='MyTestTOTP', issuer_name='OTP令牌')
return uri
except Exception as ex:
return False
3.2、客户端代码
class OtpClient(object):
def __init__(self, key):
if key:
self.key = key
else:
self.key = None
def create_totp(self):
if self.key is None:
return ''
try:
otp = pyotp.TOTP(base64.b32encode(self.key.encode('utf-8')).decode('utf-8'))
code = otp.now()
print(code)
return code
except Exception as ex:
return None
3.3、模拟使用代码
客户端生成动态口令(微软身份验证器不让截屏,其实不用写代码),服务器端验证口令是否合法
if __name__ == '__main__':
c = OtpClient('MyTestSecret')
print(c.create_totp())
s = OtpServer('MyTestSecret')
code = input('input code:')
print(s.verify(code))
结果为True说明验证通过
热门推荐
滑动变阻器故障排除全攻略:从接触不良到接线错误
三甲医院专家提醒:定期体检是预防淋巴结节的关键
如何用电流表或万用表测电流
淋巴结节:从诊断到治疗的全程管理
数字万用表原理详解:从直流电压到二极管测量
基尔霍夫电路定律详解:电流定律与电压定律的原理与应用
各类设备电池更换指南:步骤详解与安全提醒
MySQL数据库误删数据恢复技巧大揭秘
中央大街周边5景:教堂、江景、公园各具特色
果洛自驾游攻略:必去旅游景点与路线推荐
如何安全开车到海南?长途驾驶的准备和注意事项有哪些?
红萝卜生芽能吃吗?(红萝卜的萌芽和营养价值分析)
从重文轻武到闭关锁国:中国历史上的重大决策失误
奥林特佩克之战:西班牙人对玛雅文明的降维打击
国内唯一专题类宋瓷博物馆在遂宁,藏南宋最大规模瓷器窖藏
四川遂宁:观音湖赏夜景,圣莲岛住超值万豪
游科潘遗址,谈玛雅文化
揭秘玛雅文明:千年前壁画重现,古老文明的惊人成就令人咋舌

神秘消失的玛雅人:文明程度之超前,或颠覆你的认知
咖啡因不只是提神:5大健康功效与安全饮用指南
咖啡不仅提神,还能减肥抗氧化,营养师推荐最佳饮用时段
仁义礼智信:传统儒家思想在现代企业的创新实践
探索斗罗大陆绝世唐门中的少儿世界
从尊重到信任:十个实用技巧提升领导沟通效果
打造高情商:从识别到提升的职场指南
柚子皮泡水喝并不能治疗乙肝——揭示误区,倡导科学认知
新国标下的快递服务变革:更准时、更环保、更安全
2024年邮政快递新规解读:资费调整全攻略
从500亿到700亿,宗馥莉如何带领娃哈哈重返巅峰
娃哈哈换代:宗馥莉主导数字化转型遭遇内部挑战