Make Tools
2026-04-11

TOTP 验证码生成器:两步验证完全指南

了解 TOTP 工作原理,用 JavaScript 和 Python 实现两步验证,以及两步验证的安全最佳实践。

安全2FA认证

什么是 TOTP?

TOTP(基于时间的一次性密码)是两步验证(2FA)中最常用的技术。它每 30 秒生成一个 6 位数字验证码,即使密码泄露,攻击者也无法登录——因为他们没有这个动态码。

TOTP 基于 HMAC-SHA1 算法,将共享密钥和当前时间戳结合生成验证码。Google Authenticator、Authy、1Password 等应用都使用 TOTP 标准。我们的 TOTP 验证码生成器 在浏览器中直接计算验证码,方便调试和测试。

TOTP 的工作原理

  1. 设置阶段:服务端生成一个共享密钥,以二维码或密钥文本形式提供给用户。
  2. 生成阶段:用户设备用共享密钥 + 当前时间戳计算 6 位验证码。
  3. 验证阶段:服务端用相同算法计算验证码,与用户输入对比。
TOTP = HOTP(secret_key, time_counter)
time_counter = floor(Unix_timestamp / 30)

示例:
密钥: JBSWY3DPEHPK3PXP
时间戳: 1712851200
计数器: 1712851200 / 30 = 57095040
验证码: 472 391 (6 位数字)

使用 JavaScript 实现 TOTP

// TOTP 生成实现
async function generateTOTP(secret, period = 30, digits = 6) {
  // Base32 解码密钥
  const key = base32Decode(secret);

  // 计算时间计数器
  const time = Math.floor(Date.now() / 1000 / period);
  const timeBuffer = new ArrayBuffer(8);
  new DataView(timeBuffer).setUint32(4, time, false);

  // HMAC-SHA1
  const cryptoKey = await crypto.subtle.importKey(
    'raw', key, { name: 'HMAC', hash: 'SHA-1' }, false, ['sign']
  );
  const hmac = await crypto.subtle.sign('HMAC', cryptoKey, timeBuffer);

  // 动态截断
  const view = new DataView(hmac);
  const offset = view.getUint8(19) & 0x0f;
  const code = (view.getUint32(offset) & 0x7fffffff) % Math.pow(10, digits);

  return code.toString().padStart(digits, '0');
}

// 使用示例
generateTOTP('JBSWY3DPEHPK3PXP').then(code => {
  console.log('当前验证码:', code);  // 如: 472391
});

Python 实现 TOTP

# Python: 生成 TOTP 验证码
import hmac
import hashlib
import struct
import time
import base64

def generate_totp(secret, period=30, digits=6):
    # Base32 解码
    key = base64.b32decode(secret.upper())

    # 时间计数器
    time_counter = int(time.time()) // period
    time_bytes = struct.pack('>Q', time_counter)

    # HMAC-SHA1
    hmac_hash = hmac.new(key, time_bytes, hashlib.sha1).digest()

    # 动态截断
    offset = hmac_hash[-1] & 0x0f
    code = struct.unpack('>I', hmac_hash[offset:offset+4])[0] & 0x7fffffff
    otp = code % (10 ** digits)

    return str(otp).zfill(digits)

print(generate_totp('JBSWY3DPEHPK3PXP'))  # 如: 472391

二维码中的密钥格式

大多数服务以二维码形式提供 TOTP 密钥,格式为 otpauth:// URI:

otpauth://totp/Example:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30
  • secret:Base32 编码的共享密钥
  • algorithm:哈希算法(SHA1、SHA256、SHA512)
  • digits:验证码位数(6 或 8)
  • period:时间步长(默认 30 秒)

安全最佳实践

  • 备份恢复码:启用 2FA 时一定保存恢复码。丢失设备 + 没有恢复码 = 永久锁定。
  • 使用认证器应用:优于短信验证码——SIM 卡劫持可以拦截短信,但无法获取 TOTP 密钥。
  • 同步认证器:使用 Authy 或 1Password 等支持云同步的认证器,避免设备丢失时无法登录。
  • 密钥安全存储:TOTP 密钥等同于密码。不要以明文存储在笔记应用中。

常见问题

为什么验证码是 6 位数字?

6 位提供 100 万种组合,对于 30 秒的有效期来说已足够安全。8 位更安全但用户输入更麻烦。大多数服务选择 6 位作为平衡点。

验证码有时不匹配怎么办?

最常见原因是设备时间不准确。TOTP 依赖精确的系统时间,几秒的偏差就可能导致不匹配。检查设备的时间设置是否为自动同步。

这个工具能用来登录吗?

我们的 TOTP 验证码生成器 主要用于调试、测试和学习 TOTP 算理。对于日常登录,推荐使用专用的认证器应用。

所有服务都用 TOTP 吗?

大多数支持 2FA 的服务使用 TOTP,但有些使用自有协议(如微信、支付宝的扫码登录)。不过 TOTP 是最广泛的开放标准。

总结

TOTP 是两步验证的核心技术,简单而强大。理解其工作原理有助于正确使用和调试 2FA 系统。使用我们的 TOTP 验证码生成器 在浏览器中直接生成验证码,支持自定义密钥、时间步长和算法参数。

试试这个工具?

打开工具 →