主要可以分两类 HMAC-Based One-time Password (HOTP) 在RFC 4226规范中 Time-based One-time Password (TOTP) 在RFC 6238 规范中 这里主要讲TOTP 客户端 其常见的手机客户端有Google Authenticator APP以及阿里云的身份宝。 实例 生成客户端密钥的二维码 String secret = Base32.random(); Totp totp = new Totp(secret); String uri = totp.uri(account 校验 boolean isValid = totp.verify(code); 其源码如下 /** * Verifier - To be used only on the server DELAY_WINDOW aerogear-otp-java本身不提供DELAY_WINDOW的修改,不过你可以继承Totp,自己扩展一下。
TOTP算法是上述算法基于时间的变体,使用通过时间戳和时间步长推导出来的数值T来代替原有HOTP算法中的计数器C。 这一部分概括性的总结了,在设计TOTP算法时需要考虑的方面。 TOTP算法是用时间因子来表示计数器的一种计算一次性密码的HOTP算法的变体。 描述 Basically, we define TOTP as TOTP = HOTP(K, T), where T is an integer and represents the number of 一般而言,我们将TOTP定义为TOTP = HOTP(K, T),其中T是一个整数,代表了在初始时间T0和当前Unix时间之间的时间步长。
基本原理 TOTP只是将其中的参数C变成了由时间戳产生的数字。 TOTP(K,C) = HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) 不同点是TOTP中的C是时间戳计算得出。 = pyotp.TOTP(secretKey) >>> totp.now() 423779 程序的简单说明 加载base64的模块,将我的秘钥做一下base32的加密,加载pyotp模块,otp使用 pyotp的TOTP的使用说明(官网) totp = pyotp.TOTP('base32secret3232') totp.now() # => 492039 # OTP verified for current time totp.verify(492039) # => True time.sleep(30) totp.verify(492039) # => False pyotp的HOTP的使用说明
生活中我们会经常使用到TOTP的算法应用,如银行的动态口令器、网络游戏中的将军令、登录场景下的手机二次验证等等。 TOTP算法是上述算法基于时间的变体,使用通过时间戳和时间步长推导出来的数值T来代替原有HOTP算法中的计数器C。 算法要求 这一部分概括性的总结了,在设计TOTP算法时需要考虑的方面。 证明者和验证者都必须知道或者能够根据Unix时间推导得出OTP。 TOTP算法 TOTP算法是用时间因子来表示计数器的一种计算一次性密码的HOTP算法的变体。 释义 X表示以秒为单位的时间步长(默认为30秒),它是一个系统参数。 描述 一般而言,我们将TOTP定义为TOTP = HOTP(K, T),其中T是一个整数,代表了在初始时间T0和当前Unix时间之间的时间步长。
为 Linux 服务器 SSH 添加 TOTP 动态验证码以及 Java 实现算法 ? 0x00 TOTP 动态验证码? TOTP 基于时间的一次性密码算法(Time-Based One-Time Password)是一种根据预共享的密钥与当前时间计算一次性密码的算法,利用不同设备时间相同的特性,将时间作为特定算法的一部分从而达到无需网络进行安全验证的目的 当前有很多领域和行业在使用 TOTP 作为它们的安全验证,比如银行使用的实体验证器,网易的网易将军令等。 这套算法在 RFC6238 中有详细的说明,在后面的实现算法部分详细说明。 0x03 算法原理 现有实现了 TOTP 的软件中的算法 本质上就是 HMAC-SHA-1 算法,也就是带有盐值的 SHA-1 1. secret 密钥 * @return 验证码 */ public static String code(String secret) { return Totp.totp
Cal.com TOTP认证绕过漏洞(CVE-2025-66489)深度分析与验证项目概述本项目针对 CVE-2025-66489 高危漏洞提供完整的技术分析与验证代码。 该漏洞存在于流行的开源日程调度平台 Cal.com 的认证机制中,由于密码验证逻辑的致命缺陷,攻击者仅需提供用户的邮箱和一个有效的TOTP(双重认证)验证码,即可完全绕过密码验证,实现远程账户接管。 admin@example.com \ --csrf abcdef1234567890 \ --password invalid_pass \ --totp 654321典型使用场景1. 8f2a9d3b5c7e1f4a \ --totp 9876543. 完全跳过password验证 if totp_code and verify_totp(user, totp_code): # ⚠️ 直接登录成功,跳过密码验证!
2、TOTP 弱点和漏洞编辑 TOTP 代码可以像密码一样被钓鱼,但它们需要网络钓鱼者实时代理凭证,而不是及时收集它们,不限制登录尝试的实现容易受到强制执行代码的攻击。 基本原理 TOTP 只是将其中的参数 C 变成了由时间戳产生的数字。 TOTP(K,C) = HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) 不同点是 TOTP 中的 C 是时间戳计算得出。 4.3、pyotp 的 TOTP 的使用说明 totp = pyotp.TOTP('base32secret3232') totp.now() # => 492039 # OTP verified for current time totp.verify(492039) # => True time.sleep(30) totp.verify(492039) # => False 4.4、pyotp
GitHub支持多种双重验证(2FA)方式,包括基于时间的一次性密码(TOTP)和基于推送通知的验证。 找到账户: 在您的TOTP应用中,找到您需要认证代码的账户。这通常按网站或服务名称列出。 查看代码: 应用将显示一个每30秒更换一次的6-8位数代码。这就是您的TOTP代码。 如果您使用的是浏览器扩展进行TOTP,流程类似。点击浏览器中的扩展图标,找到相关账户,然后使用它提供的代码。 请记住,保护好您的TOTP应用或浏览器扩展的安全至关重要,因为它是保护您在线账户的关键部分。 TOTP支持: 1Password: 1Password可以生成与GitHub共享的TOTP验证码。
由此用短信作为补充因素的双因素认证是相当不可靠的,而我们今天要说的是 TOTP。 TOTP 介绍 TOTP 全称为"基于时间的一次性密码"(Time-based One-time Password)。 在用户登录时需要输入TOTP的动态验证码,这时手机中TOTP软件生成器就会使用这个密钥和当前时间戳去生成一个哈希,一般有效期为30秒。 TOTP 算法 通过TOTP的计算步骤,我们得知了哈希验证码只有30秒有效期,那么手机如何与服务器保持一致呢? 计算哈希验证码 TOTP = HASH(SecretKey, TC) HASH就是约定的哈希函数,默认是 SHA-1。 TOTP 分类 TOTP 有硬件生成器和软件生成器之分,但都是采用上面的算法。 TOTP 硬件生成器实物如下图。
而这也就是下面将要说的 TOTP,即“基于时间的一次性密码(Time-based One-time Password)”。这是目前公认的可靠解决方案,已被纳入国际标准。 TOTP 流程 TOTP 的流程如下: 1.服务器随机生成一个的密钥,并且把这个密钥保存在数据库中。2.服务端将该密钥下发,通常是在页面上显示一个二维码,内容中包含密钥。 4.客户端每 30 秒使用密钥和时间戳通过 TOTP 算法生成一个 6 位数字的一次性密码 其实利用 TOTP 验证的流程很简单,这里也只是介绍,如果想深入了解 TOTP 算法的具体实现过程,可以参考 目前 TOTP 验证 App 主要分为两类:“独占类”和“开放类”。所谓独占类指的是只支持自家账户登录的两步验证,比如 QQ 安全中心、Steam 验证令牌等。 Google Play Store 上就有许多第三方的基于 TOTP 原理实现的一次性验证码工具,只是由于国内用户使用习惯的问题,除非在一些特殊场合,例如找回密码时会用到 TOTP 验证外,其他大多数情况还是会使用短信验证码的方式
基于TOTP的2FA在上面介绍GitHub的2FA方案的时候,有提过其采用的是基于TOTP算法的2FA方案。 所谓TOTP,即基于时间的一次性密码(Time-based One-Time Password,简称TOTP),它是一种国际标准协议(RFC6238)。 def generate_totp(secret, interval=30, digits=6, timestamp=None): """ 生成基于时间的一次性密码(TOTP)。 otp = generate_totp(secret) print(f"Generated TOTP: {otp}") # 验证生成的 OTP(假设客户端和服务器的时间同步) 至此,TOTP算法所需的2个关键参数都已具备,就可以使用TOTP应用生成的验证码进行身份二次认证咯。
OATH-TOTP(开放式身份验证基于时间的一次性密码)是一种开放式协议,可生成一次性密码,通常为每30秒回收一次的6位数密码。 安装了OATH-TOTP应用程序的智能手机或平板电脑,如Google身份验证器(iOS,Android)。 由于Google制作了一个OATH-TOTP应用程序,他们还制作了一个生成TOTP的PAM,并且与任何OATH-TOTP应用程序完全兼容。 首先,更新Ubuntu的存储库缓存。 这允许没有OATH-TOTP密钥的用户仍然使用他们的SSH密钥登录。一旦所有用户都拥有OATH-TOTP密钥,您可以删除此行上的“nullok”以使其成为MFA强制。 保存并关闭文件。 我们需要告诉SSH使用TOTP代码并使用SSH密钥代替您的密码。 现在,再次打开sshd配置文件。
因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。 TOTP 的概念 TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。 TOTP 的算法 仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢? 答案就是下面的公式。 TOTP = HASH(SecretKey, TC) 上面代码中,HASH就是约定的哈希函数,默认是 SHA-1。 TOTP 有硬件生成器和软件生成器之分,都是采用上面的算法。 ? (说明:TOTP 硬件生成器) ? (说明:Google Authenticator 是一个生成 TOTP 的手机 App) TOTP 的实现 TOTP 很容易写,各个语言都有实现。 var tc = Math.floor(Date.now() / 1000 / 30); var totp = tfa.generateCode(key, tc); console.log(totp);
因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。 三、TOTP 的概念 TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。 五、TOTP 的算法 仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢? 答案就是下面的公式。 TOTP = HASH(SecretKey, TC) 上面代码中,HASH就是约定的哈希函数,默认是 SHA-1。 TOTP 有硬件生成器和软件生成器之分,都是采用上面的算法。 (说明:TOTP 硬件生成器) (说明:Google Authenticator 是一个生成 TOTP 的手机 App) 五、TOTP 的实现 TOTP 很容易写,各个语言都有实现。 var tc = Math.floor(Date.now() / 1000 / 30); var totp = tfa.generateCode(key, tc); console.log(totp);
>>> totp = pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2') >>> totp.now() '941782' >>> 现在,你有 30 秒的时间将这个 只要两者不一致,就验证失败,也就是下面这段逻辑,如果超过 30 秒,(当然,30 秒可以自定义),也会失效: >>> totp = pyotp.TOTP('BZ4TOJD4JWWJWPQBKP23FA55EMHA25Y2 ') >>> totp.verify('941782') True >>> time.sleep(30) >>> totp.verify('941782') False 除了使用基于时间的动态密码,也可以用基于计数的动态密码 ,然后扫描下发的二维码,就可以生成动态码: 然后你可以执行下面这段代码,就可以发现 pyotp 产生的动态码和 Google Authenticator 产生的是一致的: import pyotp totp = pyotp.TOTP("JBSWY3DPEHPK3PXP") print("Current OTP:", totp.now()) 其实二维码的信息就是 JBSWY3DPEHPK3PXP。
Zabbix 7.0 目前支持TOTP和 Duo Universal Prompt二种类型的MFA,可选择最符合其安全要求和偏好的选项。 Zabbix TOTP多因素身份验证 1.Zabbix中"用户"→"认证"→"MFA设置"→启用多重身份验证MFA。 注意:MFA功能依赖php-curl组件,如果未安装会存在错误提示。 2.添加MFA方法,选择 类型:TOTP、名称:Zabbix TOTP、哈希函数:SHA-1、代码长度:6。 3.用户→ 用户组,创建新的用户组,配置组名:TOTP组、用户:Admin,多因素身份验证:默认值(如果未设置为默认值,则为"Zabbix TOTP")。 4.注销Zabbix并使用您的凭据重新登录。 注意:TOTP 多因素身份验证依赖于正确的系统时间,确保客户端和服务器上的时间设置正确。用于生成 TOTP 和身份验证认证的服务器时间应同步. 否则,将会导致认证失败。
但是,我们还可以用另外一种方法令其更安全:那就是基于时间的一次性密码(TOTP)。 TOTP允许您使用一次性密码(每30秒更改一次)为SSH启用双重身份验证。 本教程将说明如何安装必要的软件,配置系统以使用双重身份验证(2FA),并将TOTP与现有安全功能结合使用。 它生成的TOTP与Google身份验证器以及各种其他流行的身份验证应用程序兼容。 生成密钥 既然已经安装了软件包,您将使用它们来生成密钥。客户端设备上的软件使用这些密钥生成TOTP。 生成密钥: gen-oath-safe example-user totp 替换example-user为您启用双因素身份验证的用户名。totp选项指定基于时间的一次性密码,而不是基于计数器的密码。 配置身份验证设置 本教程中的TOTP身份验证方法使用PAM或可插入身份验证模块。PAM将低级认证机制集成到可以为不同应用程序和服务配置的模块中。
因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。 三、TOTP 的概念 TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。 五、TOTP 的算法 仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢? 答案就是下面的公式。 TOTP = HASH(SecretKey, TC) 上面代码中,HASH就是约定的哈希函数,默认是 SHA-1。 TOTP 有硬件生成器和软件生成器之分,都是采用上面的算法。 ? (说明:TOTP 硬件生成器) ? (说明:Google Authenticator 是一个生成 TOTP 的手机 App) 五、TOTP 的实现 TOTP 很容易写,各个语言都有实现。 var tc = Math.floor(Date.now() / 1000 / 30); var totp = tfa.generateCode(key, tc); console.log(totp
支持以下认证方式:TOTP口令密码认证短信验证码认证TOTP口令密码认证重置用户密码时,会同时关闭TOTP口令密码认证功能。执行重置密码操作后,建议及时还原该认证方式相关配置,以免产生不必要的影响。 【用户动态口令二维码】:开启TOTP口令密码认证后,首次登录时登录界面会展示TOTP动态口令(此后,只能在【个人中心】>【个人信息】页面单击【查看动态口令】查看)。 Note:常见的身份验证客户端工具包括移动端App(Authenticator)、浏览器插件(authenticator 2fa client)以及微信小程序(TOTP身份安全认证器)等。
因为Google做了一个OATH-TOTP应用程序,还制作了一个PAM,它可以生成TOTP,并且与任何OATH-TOTP应用程序完全兼容,比如Google身份验证程序或Authy. 这允许未经OATH-TOTP令牌的用户仍然可以使用他们的SSH密钥登录。一旦所有用户都有了OATH-TOTP令牌,您就可以删除nullok使MFA成为强制性的。 保存并关闭文件。 技巧 提示1-恢复访问 丢失SSH密钥或TOTP密钥 如果您丢失了SSH密钥或TOTP密钥,则可以将恢复分成几个步骤。 然后,获取这个秘密密钥并手动将其输入到一个TOTP应用程序中。 无法访问TOTP应用程序 如果您需要登录到您的服务器,但无法访问您的TOTP应用程序来获取您的验证代码,您仍然可以使用第一次创建秘密密钥时显示的恢复代码登录。请注意,这些恢复代码是一次性使用的。