网站首页 > 技术文章 正文
更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)
TOTP(Time-based One-Time Password)代表基于时间的一次性密码。许多网站和服务需要两因素身份验证(2FA)或多因素身份验证(MFA),其中要求用户提供两个或更多要素:
- 只有用户知道的内容,例如密码,密码短语等。
- 只有用户拥有的东西,例如硬件令牌,手机等。
- 例如,只有用户才可以使用生物识别。
TOTP值用作第二个因素,即,它证明用户拥有包含TOTP秘密密钥的设备(例如,移动电话),并从中生成TOTP值。通常,提供用户帐户的服务提供商还会发布一个加密为Base32字符串或QR码的密钥。此密钥被添加到移动设备上的身份验证器应用程序(例如Google Authenticator)中。然后,该应用可以根据当前时间生成TOTP值。默认情况下,它每30秒生成一个新的TOTP值。
MinTOTP是一个Python工具,可用于从密钥生成TOTP值。此外,它为Python开发人员将其功能公开为模块级功能。它可以在安装了Python 3.4或更高版本的任何系统上使用。
源代码
TOTP算法的核心是HOTP算法。HOTP代表基于HMAC的一次性密码。HMAC代表基于哈希的消息身份验证代码。以下是相关的RFC,以了解有关这些算法的更多信息:
- RFC 2104:HMAC:消息身份验证的键哈希
- RFC 4226:HOTP:基于HMAC的一次性密码算法
- RFC 6238:TOTP:基于时间的一次性密码算法
#!/usr/bin/python3
import base64
import hmac
import struct
import sys
import time
def hotp(key, counter, digits=6, digest='sha1'):
key = base64.b32decode(key.upper() + '=' * ((8 - len(key)) % 8))
counter = struct.pack('>Q', counter)
mac = hmac.new(key, counter, digest).digest()
offset = mac[-1] & 0x0f
binary = struct.unpack('>L', mac[offset:offset+4])[0] & 0x7fffffff
return str(binary)[-digits:].rjust(digits, '0')
def totp(key, time_step=30, digits=6, digest='sha1'):
return hotp(key, int(time.time() / time_step), digits, digest)
def main():
args = [int(x) if x.isdigit() else x for x in sys.argv[1:]]
for key in sys.stdin:
print(totp(key.strip(), *args))
if __name__ == '__main__':
main()
在上面的代码中,使用hmacPython标准库中提供的模块来实现HOTP。可以在hotp()函数中找到实现。这是RFC 2104的非常简单的实现 :第5节:HOTP算法。它采用Base32编码的秘密密钥和计数器作为输入。它返回一个6位数的HOTP值作为输出。
该totp()函数实现了TOTP算法。它是围绕HOTP算法的精简包装。通过使用密钥和自Unix纪元(1970-01-01 00:00:00 UTC)起经过的时间间隔数(默认为30秒间隔)调用HOTP函数来获得TOTP值。
安装:
输入以下命令以在系统上安装MinTOTP:pip3 install mintotp
测试MinTOTP是否可以作为命令正常工作:mintotp <<< ZYTYYE5FOAGW5ML7LRWUL4WTZLNJAMZS,应输出6位数的TOTP值。
测试MinTOTP可以用作库模块:
$ python3
>>>import mintotp
>>> mintotp.totp(' ZYTYYE5FOAGW5ML7LRWUL4WTZLNJAMZS ')
>>> mintotp.hotp(' ZYTYYE5FOAGW5ML7LRWUL4WTZLNJAMZS ',42)
该totp()函数调用应返回基于当前时间的6位TOTP值。该hotp()呼叫应返回以下HOTP值:626854。
路径在:https://github.com/susam/mintotp
更多:bash版本的实现:
https://github.com/jakwings/bash-totp/blob/git/nerd/underdog/eunuch/moron/ass/cunt/shit/totp
猜你喜欢
- 2024-12-20 微软确认Win10更新出现问题:建议完全重置系统
- 2024-12-20 【MFRC522】STM32 MFRC522 IC读卡 程序及原理图
- 2024-12-20 win10更新又双叒翻车 这几天出了这些问题都是它的锅
- 2024-12-20 微软 Win10 KB5003173 更新安装失败,原因是没有新版 Edge浏览器
- 2024-12-20 今年最后一次可选更新:微软Win11推送26100.2454
- 2024-12-20 关于BIOS的入口地址0xFFFF0 bios information
- 2024-12-20 部分Win11 24H2用户反馈微软12月更新BUG:安装失败、蓝屏等
- 2024-12-20 Win10用户反馈安装微软3月更新时遇到0xd0000034错误
- 2024-12-20 Win11 22H2 (KB5017321) 安装更新失败如何修复
- 2024-12-20 R730调整风扇转速 r710风扇速度设置
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 511℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 487℃MySQL service启动脚本浅析(r12笔记第59天)
- 467℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 465℃启用MySQL查询缓存(mysql8.0查询缓存)
- 445℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 424℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 421℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)