不需要联网的验证码
最近发现一直在用的 google authenticator 这个 app 似乎不用联网也可以生成验证码,而且这个验证码确实是能用来登录开了 2FA 的 github、chatgpt 等平台的。感觉很神奇,作为一个土生土长的拆尼斯,只知道手机短信验证码,今天闲下来研究下 google authenticator 的原理,感觉以后做项目需要登录验证身份甚至是发散到其它用途上,会是个很好的参考。 离线验证的核心秘密就在于 TOTP(Time-based One-Time Password,基于时间的一次性密码算法) 。这个算法是 HOTP(HMAC-based One-Time Password,基于消息认证码的一次性密码算法)的时间变体,它用当前时间戳替换了 HOTP 中的计数器来生成动态密码。Google Authenticator、Authy、Microsoft Authenticator 这些常见的验证器 App,底层用的都是这套逻辑。 TOTP 原理 TOTP 的生成公式其实很简单: TOTP = Truncate( HMAC-SHA-1(K, T) ) 其中 K 是共享密钥,就是绑定 2FA 时扫的二维码里藏着的那串玩意,通常是一个随机的 16 位或 32 位字符串,用 Base32 编码。这串共享密钥是会被保存到服务提供商的服务器上的。T 则是时间步数,计算公式是: T = (Current Unix Time − T0) / X X 是时间步长,默认是 30 秒(当然也可以配置成 60 秒)。举个例子,如果当前 Unix 时间戳是 1734500000,除以 30,得到 T ≈ 57816666。这个 T 会随着时间单调递增,每 30 秒就会+1。 ...