2026-04-11
TOTP 验证码生成器:两步验证完全指南
了解 TOTP 工作原理,用 JavaScript 和 Python 实现两步验证,以及两步验证的安全最佳实践。
安全2FA认证
什么是 TOTP?
TOTP(基于时间的一次性密码)是两步验证(2FA)中最常用的技术。它每 30 秒生成一个 6 位数字验证码,即使密码泄露,攻击者也无法登录——因为他们没有这个动态码。
TOTP 基于 HMAC-SHA1 算法,将共享密钥和当前时间戳结合生成验证码。Google Authenticator、Authy、1Password 等应用都使用 TOTP 标准。我们的 TOTP 验证码生成器 在浏览器中直接计算验证码,方便调试和测试。
TOTP 的工作原理
- 设置阶段:服务端生成一个共享密钥,以二维码或密钥文本形式提供给用户。
- 生成阶段:用户设备用共享密钥 + 当前时间戳计算 6 位验证码。
- 验证阶段:服务端用相同算法计算验证码,与用户输入对比。
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 验证码生成器 在浏览器中直接生成验证码,支持自定义密钥、时间步长和算法参数。
试试这个工具?
打开工具 →