OTP一次性口令(one time password),我们收到的短信验证码,就算是一种一次性口令,因为它只能使用一次,还有登陆时候验证码,就是那种歪歪扭扭的字~
实际上,这是一种增强验证的方式,短信验证码属于比较好的双因素验证,因为绑定了手机号,所以接收人就是唯一的,但是这也导致隐私问题泄露,比如国外的REG007就能花钱买到手机号注册的网站,如果发现你注册了某个色情APP,那不就很尴尬了嘛~
而登陆验证码也是一种双因素验证(划掉,感谢 @刀刀少 评论区的提醒,登录的验证码不算双因素),但是效果差一点,只能防君子,不能防小人,毕竟现在2021年了,OCR技术那么成熟,还是比较容易破解的,不过用君子打比方,也比较抬高大家了,毕竟只有研究(黑客划掉)网络安全的人,才会这么无聊去破解吧~
有那时间破解验证码,还不如学习一下CTF,学生时代打个比赛,它不香吗?不过话说回来,有些坑,还是要趁年轻去填一填的~
今天的主题是OTP,老规矩只看代码,不聊内幕。这是在研究零信任SDP软件定义边界的时候,有幸接触到的,简单学习了一点皮毛,在这里班门弄斧,密码学大佬轻喷哈~
- TOTP(时间同步) 每次运行的时候,口令30秒内不变,是不是超级像短信验证码
- HOTP(事件同步) 每次运行的时候,口令都会立即发生变化,是不是超级像登陆验证码
下面是2个具体的demo案例,两个OPT使用方法的差异非常小,但是网上很少能找到HOTP的案例(真的找不到),所以记录一下,以防止自己迷路,快速成长,少走弯路~
一、TOTP案例demo

# -*- coding: utf-8 -*-
"""
@Time : 2021/3/10 20:07
@Auth : ailx10
@File :demo-totp.py
@IDE :PyCharm
"""
import base64
import pyotp
string = "passwd"
key = base64.b32encode(string.encode(encoding="utf-8"))
totp_func = pyotp.TOTP(key)
my_key = totp_func.now()
print("一次性口令1:",my_key)
my_key2 = totp_func.now()
print("一次性口令2:",my_key2)
status = totp_func.verify(my_key)
print("一次性口令验证状态:",status)
二、HOTP案例demo

# -*- coding: utf-8 -*-
"""
@Time : 2021/3/10 20:23
@Auth : ailx10
@File :demo-hotp.py
@IDE :PyCharm
"""
import base64
import pyotp
import random
string = "passwd"
key = base64.b32encode(string.encode(encoding="utf-8"))
random.seed(version=2)
r1 = random.randint(1,9999)
r2 = random.randint(1,9999)
hotp_func = pyotp.HOTP(key)
my_key = hotp_func.at(r1)
print("一次性口令1:",my_key)
my_key2 = hotp_func.at(r2)
print("一次性口令2:",my_key2)
status = hotp_func.verify(my_key,r1)
print("一次性口令验证状态:",status)
本篇完,谢谢大家~