分类
devops

Two-factor authentication code principles

双因素认证(2FA)中的验证码原理

验证码是通过时间同步或者算法生成的一次性密码,服务器可以用相同的方法重新计算来验证它是否正确。


两种常见的验证码方式

基于时间的一次性密码(TOTP)

这是最常见的方式(比如 Google Authenticator、Microsoft Authenticator):

  • 你的手机和服务器都共享一个密钥(在你首次扫描二维码时交换)
  • 每隔 30 秒,手机和服务器都会用这个密钥 + 当前时间,通过同一个加密算法(HMAC-SHA1)计算出一个 6 位数字
  • 因为时间同步,两边计算出来的数字完全相同
  • 你把这个数字输入登录页面,服务器也算一遍,如果一致就说明你拥有那个密钥

基于计数的一次性密码(HOTP)

  • 原理类似,但不是用时间,而是用一个计数器
  • 每次生成后计数器 +1
  • 适用于一些硬件令牌

为什么很难破解

特点 好处
一次性 每个码只能用一次,用过就失效,即使被偷听也没用
30秒有效期 时间窗口很短,攻击者必须立即使用
密钥不传输 密钥只在你的手机和服务器上,网络上传输的只是生成的码,不是密钥本身
无状态验证 服务器不需要存储码,只需要用密钥重新计算,防止数据库泄露

实际例子

假设你的密钥是 SECRET123,当前时间戳是 1672531200:

  1. 你的手机计算:HMAC-SHA1(SECRET123 + 1672531200) → 生成 123456
  2. 你输入 123456
  3. 服务器也计算:HMAC-SHA1(SECRET123 + 1672531200) → 得到 123456
  4. 对比成功 ✓

30 秒后,时间戳变了,生成的码就完全不同了。