<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>TOTP on NOSAE</title>
    <link>https://nosae.top/tags/totp/</link>
    <description>Recent content in TOTP on NOSAE</description>
    <image>
      <title>NOSAE</title>
      <url>https://nosae.top/images/papermod-cover.png</url>
      <link>https://nosae.top/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.147.2</generator>
    <language>zh</language>
    <copyright>NOSAE</copyright>
    <lastBuildDate>Fri, 12 Jun 2026 23:48:07 +0800</lastBuildDate>
    <atom:link href="https://nosae.top/tags/totp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>不需要联网的验证码</title>
      <link>https://nosae.top/posts/%E4%B8%8D%E9%9C%80%E8%A6%81%E8%81%94%E7%BD%91%E7%9A%84%E9%AA%8C%E8%AF%81%E7%A0%81/</link>
      <pubDate>Fri, 12 Jun 2026 23:48:07 +0800</pubDate>
      <guid>https://nosae.top/posts/%E4%B8%8D%E9%9C%80%E8%A6%81%E8%81%94%E7%BD%91%E7%9A%84%E9%AA%8C%E8%AF%81%E7%A0%81/</guid>
      <description>&lt;p&gt;最近发现一直在用的 google authenticator 这个 app 似乎不用联网也可以生成验证码，而且这个验证码确实是能用来登录开了 2FA 的 github、chatgpt 等平台的。感觉很神奇，作为一个土生土长的拆尼斯，只知道手机短信验证码，今天闲下来研究下 google authenticator 的原理，感觉以后做项目需要登录验证身份甚至是发散到其它用途上，会是个很好的参考。&lt;/p&gt;
&lt;p&gt;离线验证的核心秘密就在于 TOTP（Time-based One-Time Password，基于时间的一次性密码算法） 。这个算法是 HOTP（HMAC-based One-Time Password，基于消息认证码的一次性密码算法）的时间变体，它用当前时间戳替换了 HOTP 中的计数器来生成动态密码。Google Authenticator、Authy、Microsoft Authenticator 这些常见的验证器 App，底层用的都是这套逻辑。&lt;/p&gt;
&lt;h2 id=&#34;totp-原理&#34;&gt;TOTP 原理&lt;/h2&gt;
&lt;p&gt;TOTP 的生成公式其实很简单：&lt;/p&gt;


&lt;blockquote class=&#34;markdown-alert markdown-alert--&#34;&gt;
  &lt;div class=&#34;markdown-alert__title&#34;&gt;&lt;/div&gt;
  &lt;div class=&#34;markdown-alert__content&#34;&gt;&lt;p&gt;TOTP = Truncate( HMAC-SHA-1(K, T) )&lt;/p&gt;&lt;/div&gt;
&lt;/blockquote&gt;&lt;p&gt;其中 K 是共享密钥，就是绑定 2FA 时扫的二维码里藏着的那串玩意，通常是一个随机的 16 位或 32 位字符串，用 Base32 编码。这串共享密钥是会被保存到服务提供商的服务器上的。T 则是时间步数，计算公式是：&lt;/p&gt;


&lt;blockquote class=&#34;markdown-alert markdown-alert--&#34;&gt;
  &lt;div class=&#34;markdown-alert__title&#34;&gt;&lt;/div&gt;
  &lt;div class=&#34;markdown-alert__content&#34;&gt;&lt;p&gt;T = (Current Unix Time − T0) / X&lt;/p&gt;&lt;/div&gt;
&lt;/blockquote&gt;&lt;p&gt;X 是时间步长，默认是 30 秒（当然也可以配置成 60 秒）。举个例子，如果当前 Unix 时间戳是 1734500000，除以 30，得到 T ≈ 57816666。这个 T 会随着时间单调递增，每 30 秒就会+1。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
