网站首页 > 技术文章 正文
更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)
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风扇速度设置
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)