草庐IT

安全开发:身份认证方案之 Google 身份验证器和基于时间的一次性密码 TOTP 算法

参考资料在文末注明,如本文有错漏欢迎评论区指出👏目前很多应用都逐步采用了双因子认证或者说MFA认证方案,因此本文介绍一下背后的机制和TOTP算法原理。使用TOTP算法,只要满足两个条件:1)基于相同的密钥;2)时钟同步;只需要事先约定好密钥,TOTP算法就可以保证校验段和被校验端具有相同的输出。OTP在介绍TOTP算法前,先介绍一下OTP算法。OTP,OneTimePassword,又称一次性口令、一次性密码、动态密码、单次有效密码。OTP基于专门的算法每隔一定的时间间隔生成一个不可预测的随机数字组合。OTP密码有效期仅在一次会话或者交易过程中,因此不容易受到重放攻击。OTP分为计次使用和计时

从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP

Github于2023-03-09推出一项提高软件安全标准的措施,所有在Github上贡献过代码的开发人员在年底前必须完成2FA(Two-factoryauthentication,双因子认证)。初听此事之时,不以为意,因为自己之前就知道双因子认证,就是说登录账号时,不仅需要密码,还需要额外的认证方式,我们熟知的短信验证码就是其中的一种方式。2FA但当我准备启用Github账号的2FA时,我却发现Github虽然提供了SMS/Textmessage的选项,但并不支持国内手机号码,也就是说大陆无法收到验证码。Github支持的二次验证方式如下AuthenticatorappSMS/Textmes

基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现

从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,毫无疑问,是出于安全层面的考虑,毕竟Github账号一旦被盗,所有代码仓库都会毁于一旦,关于双因子登录的必要性请参见:别让你的服务器(vps)沦为肉鸡(ssh暴力破解),密钥验证、双向因子登录值得拥有。双因子登录说白了就是通过第三方设备证明"你是你自己"的一个措施,Github官方推荐在移动端下载1Password、Authy、MicrosoftAuthenticator等APP来通过扫码进行验证,其实大可不必如此麻烦,本次我们通过Python/Golang代码来实现双因子登录验证。TOTP算法Time

算法~totp用作签名防止url被复用

之前写过关于totp的文章,对它的基础有不清楚的同学,可以先看我的这篇文章《TOTP基础一》《TOTP基础二》想到的问题因为totp是把时间分成了一个一个小的时间窗口,当生成totp的服务器和校验totp的服务器不在一起时间窗口,就会出现验证失败的问题,这是不可避免的,时间戳是一个long类型的数字,当这个数字进行totp运算后,落在哪个窗口里是确定的,但你的时间戳数字是不确定的,因为你不知道用户在什么时间触发totp这个生产的动作。时间窗口从下面的图中可以看到,时间两个窗口总会有一个交叉,谁赶上了都不一定,所以我们要解决这个不一定的问题。最多跨一个窗口我们的生成totp端和校验totp端,他

java和c#里的TOTP统一算法

基础说明本文根据RFC4226和RFC6238文档,详细的介绍HOTP和TOTP算法的原理和实现。两步验证已经被广泛应用于各种互联网应用当中,用来提供安全性。对于如何使用两步验证,大家并不陌生,无非是开启两步验证,然后出现一个二维码,使用支持两步验证的移动应用比如GoogleAuthenticator或者LassPassAuthenticator扫一下二维码。这时候应用会出现一个6位数的一次性密码,首次需要输入验证从而完成开启过程。以后在登陆的时候,除了输入用户名和密码外,还需要把当前的移动应用上显示的6位数编码输入才能完成登陆。这个过程的背后主要由两个算法来支撑:HOTP和TOTP。也分别对

基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现

从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,毫无疑问,是出于安全层面的考虑,毕竟Github账号一旦被盗,所有代码仓库都会毁于一旦,关于双因子登录的必要性请参见:别让你的服务器(vps)沦为肉鸡(ssh暴力破解),密钥验证、双向因子登录值得拥有。双因子登录说白了就是通过第三方设备证明"你是你自己"的一个措施,Github官方推荐在移动端下载1Password、Authy、MicrosoftAuthenticator等APP来通过扫码进行验证,其实大可不必如此麻烦,本次我们通过Python/Golang代码来实现双因子登录验证。TOTP算法Time

python - 是否可以在服务器上加盐和/或散列 HOTP/TOTP secret ?

我正在构建一个基于TOTP/HOTP的双因素身份验证系统。为了验证otp,服务器和otp设备都必须知道共享key。由于HOTP密码与用户密码非常相似,我认为应该应用类似的最佳实践。特别是强烈建议永远不要存储未加密的密码,只保留密码的加盐哈希值。RFC和HOTP/TOTP的python实现似乎都没有涵盖这方面。有没有一种方法可以使用OTP共享key的单向加密,或者这是一个愚蠢的想法? 最佳答案 Isthereawaytouseone-wayencryptionoftheOTPsharedsecret...?不是真的。您可以使用可逆加密

【TOTP】基于时间的动态密码及其工程实践

探究了常见的动态密码的实现方式及其底层原理,并基于java做出了工程实践。文章目录A.来源于一个现象的好奇B.2FAC.TOTP1.什么是TOTP2.原理详解(基于java-totp项目分析)3.这样真的安全吗4.常见的支持TOTP的软件1.GoogleAuthenticator2.MicrosoftAuthenticatorD.项目实践(基于Java)E.总结参考资料A.来源于一个现象的好奇用过公司vpn的都知道,不管是阿里郎还是字节那个连vpn的工具(叫啥记不得了),在电脑连上的时候,都需要手机端做一个二次校验,输入六位数字,这个六位数字每隔几十秒会变动一下。对于这个东东,有时候好奇心驱使

python - 难以将 Python3 获取 hotp/totp token 代码转换为 Swift3

最近我发现thisawesome2-factorauthenticationcodegenerator用Python3编写。我试图将它转换为Swift3,但我在一个特定部分遇到了问题:defget_hotp_token(secret,intervals_no):key=base64.b32decode(secret)msg=struct.pack(">Q",intervals_no)h=hmac.new(key,msg,hashlib.sha1).digest()o=h[19]&15h=(struct.unpack(">I",h[o:o+4])[0]&0x7fffffff)%10000

go - 使用一个 secret 生成 totp 与多个 secret

我想在我的网站上使用2fa的谷歌验证器和totp算法。我有2个关于生成QR密码的问题。我计划使用保险库来存储secret以更加安全,但我的问题是有没有其他方法可以每次生成secret而不是将其存储在某些存储设备中?我在教程中读到我需要为每个用户使用随secret码并将该密码存储在数据库中以进行otp验证。我的想法是将一个特定的secret存储在某个安全的地方,并使用每个用户的secret生成一个散列。例如,使用mySecret+userId生成哈希这是一种安全的方式吗? 最佳答案 使用主key并通过sha256生成用户key是个坏主
12