FreeOTP WIKI
HOTP
HOTP(RFC 4226)全称为:HMAC-based One-Time Password algorithm,即基于HMAC的一次性密码算法。
它是官方标准化的一次性密码生成方案,由互联网工程任务组在2005年12月发布,旨在为各种网络应用(如VPN接入、Wi-Fi登录、Web应用等)提供一种可互操作的双因素认证标准
HOTP核心定义与公式
RFC4226将HOTP明确定义为:
HOTP(K, C) = Truncate(HMAC-SHA-1(K, C))
- K 是客户端和服务器之间共享的密钥(secret)
- C 是一个8字节的计数器,双方需要保持同步
- HMAC-SHA-1 是规定的哈希算法
- Truncate 是将HMAC结果截断为6-8位数字的函数
TOTP
TOTP(RFC 6238)全称为:Time-based One-Time Password algorithm,即基于时间的一次性密码算法。
它是 HOTP(RFC 4226)的时间驱动变体,由互联网工程任务组(IETF)于2011年5月正式发布为标准。TOTP已成为主动开放认证(OATH)的基石,被广泛应用于Google Authenticator、微信验证码等双因素认证(2FA)系统。
TOTP核心定义与公式
TOTP的核心思想是将HOTP中的事件计数器替换为基于时间的计数器。其基本公式为:
TOTP(K, T) = Truncate(HMAC-SHA-1(K, T))
- K:客户端与服务器之间共享的密钥(secret)
- T:时间计数器,由当前时间计算得出
- Truncate:将HMAC结果截断为6-8位数字的函数
与HOTP不同,TOTP允许使用SHA-256或SHA-512作为哈希算法,不局限于SHA-1。
以下是 HOTP (RFC 4226) 与 TOTP (RFC 6238) 的全面对比总结:
HOTP vs TOTP核心差异速览
| 对比维度 | HOTP | TOTP |
|---|---|---|
| 核心因子 | 事件计数器(Counter) | 时间戳(Time) |
| 密码有效期 | 直到下一次使用(无固定时限) | 固定时间窗口(默认30秒) |
| 服务器状态 | 需维护每个用户的计数器 | 无状态(仅需共享密钥) |
| 同步机制 | 计数器偏移窗口(如±10) | 时间步窗口(如前后各1步) |
| 时钟依赖 | 无需时钟 | 需要精确时钟同步 |
HOTP vs TOTP详细对比表
| 特性 | HOTP | TOTP |
|---|---|---|
| RFC标准 | RFC 4226 (2005年12月) | RFC 6238 (2011年5月) |
| 基础算法 | HMAC-SHA-1(强制) | HMAC-SHA-1/SHA-256/SHA-512 |
| 输出位数 | 6-8位(通常6位) | 6-8位(通常6位) |
| 移动因子 | 64位整数计数器 | floor((T - T0)/X) |
| 默认参数 | 无(计数器用户控制) | X=30秒, T0=0 |
| 硬件复杂度 | 低(仅需按钮触发) | 高(需要精确时钟晶振) |
| 用户体验 | 需手动触发(按键生成) | 自动刷新(倒计时显示) |
| 防重放能力 | 弱(攻击者可在下次使用前重放) | 强(30秒后自动失效) |
| 暴力破解防护 | 需服务端速率限制 | 需服务端速率限制 |
| 典型应用 | 银行U盾、硬件令牌 | Google Authenticator、微信/支付宝验证码 |
HOTP vs TOTP安全对比
| 安全维度 | HOTP | TOTP |
|---|---|---|
| 中间人攻击 | 可被实时劫持 | 可被实时劫持(需30秒内完成) |
| 重放攻击 | 高风险(直到下次使用) | 低风险(30秒后失效) |
| 暴力猜测 | 需服务端限流 | 需服务端限流 |
| 密钥泄露影响 | 全部后续密码泄露 | 全部后续密码泄露 |
| 社会工程学 | 相同风险 | 相同风险 |
| 设备丢失风险 | 需撤销该设备 | 需撤销该设备 |
注:两者都无法防止登录后的会话劫持,也不应作为唯一的身份验证因素。
两者均由 主动开放认证(OATH, Initiative for Open Authentication) 推动标准化,TOTP 本质上是 HOTP 的特殊化,将事件计数器替换为时间计数器,已成为现代双因素认证的事实标准。