🛡️ 终极硬核:TOTP 双重验证底层原理全解析

一、 核心概念:什么是“种下种子”?

双重验证的本质不是“实时联网验证”,而是一场基于预设算法的数学同步

1. 扫描二维码(密钥分发)

当你用 Microsoft Authenticator 扫描 GitHub 网页上的二维码时,网页并不是在“识别你的手机”,而是在进行密钥转移

2. 绑定后的“断联”

一旦你输入 6 位验证码并点击 Continue,GitHub 会立刻在服务器端关闭这个二维码的显示。

硬核结论: 钥匙已经给完,门已经锁上。除非你主动重置,否则没有任何人(包括你换了手机后的自己)能再次看到那个原始二维码。


二、 数学逻辑:为什么不需要网?

手机和服务器之间之所以能“心有灵犀”,靠的是 Unix 时间戳HMAC 算法

1. 相同的输入,相同的结果

手机 App 和 GitHub 服务器会各自在本地运行同一个公式:

OTP=Truncate(HMACSHA1(Secret,Current Time30))

2. 验证过程

  1. 手机端: 拿“本地存的 Secret” + “当前手机时间” = 算出一串 6 位数。

  2. 输入: 你通过键盘把数字告诉 GitHub。

  3. 服务器端: 拿“数据库存的 Secret” + “服务器当前时间” = 算出一串 6 位数。

  4. 比对: 两个数字一致,证明你手里确实握着那把“钥匙”。


三、 极端情况下的“生与死”

1. 手机丢了,为什么别人扫码不行?

因为生成验证码的原材料(Secret) 已经在你绑定成功的那一刻,从 GitHub 网页上彻底删除了。别人的手机扫描不到那个已经消失的二维码,自然无法种下那颗“种子”。

2. 恢复代码 (Recovery Codes) 的本质

它们是 GitHub 预先为你生成的、不依赖时间的“超级万能钥匙”。


四、 进阶:如何实现“多机同步”?

既然原理是“Secret + 时间”,那么:


五、 安全总结与建议