双因素认证(2FA)中的验证码原理
验证码是通过时间同步或者算法生成的一次性密码,服务器可以用相同的方法重新计算来验证它是否正确。
两种常见的验证码方式
基于时间的一次性密码(TOTP)
这是最常见的方式(比如 Google Authenticator、Microsoft Authenticator):
- 你的手机和服务器都共享一个密钥(在你首次扫描二维码时交换)
- 每隔 30 秒,手机和服务器都会用这个密钥 + 当前时间,通过同一个加密算法(HMAC-SHA1)计算出一个 6 位数字
- 因为时间同步,两边计算出来的数字完全相同
- 你把这个数字输入登录页面,服务器也算一遍,如果一致就说明你拥有那个密钥
基于计数的一次性密码(HOTP)
- 原理类似,但不是用时间,而是用一个计数器
- 每次生成后计数器 +1
- 适用于一些硬件令牌
为什么很难破解
| 特点 | 好处 |
|---|---|
| 一次性 | 每个码只能用一次,用过就失效,即使被偷听也没用 |
| 30秒有效期 | 时间窗口很短,攻击者必须立即使用 |
| 密钥不传输 | 密钥只在你的手机和服务器上,网络上传输的只是生成的码,不是密钥本身 |
| 无状态验证 | 服务器不需要存储码,只需要用密钥重新计算,防止数据库泄露 |
实际例子
假设你的密钥是 SECRET123,当前时间戳是 1672531200:
- 你的手机计算:
HMAC-SHA1(SECRET123 + 1672531200)→ 生成123456 - 你输入
123456 - 服务器也计算:
HMAC-SHA1(SECRET123 + 1672531200)→ 得到123456 - 对比成功 ✓
30 秒后,时间戳变了,生成的码就完全不同了。
