跳到主要内容

otpauth URI 是什么:两步验证配置二维码里藏的那串文本

扫码添加两步验证时,二维码里编码的其实是一条 otpauth:// 文本。这篇讲清它的格式、密钥发行方账号怎么填、和 TOTP 的关系,以及怎么生成给验证器 app 导入。

发布于 作者 李雷
#两步验证 #otpauth #TOTP #安全

otpauth URI 是什么:两步验证配置二维码里藏的那串文本

你在某个网站开两步验证(2FA)时,页面通常弹出一个二维码,让你用 Google Authenticator 或 Authy 扫一下。扫完账户就进了验证器列表,开始每 30 秒跳一次 6 位数。很多人到这里就停了,从没想过二维码里到底是什么。

答案是一小段文本,叫 otpauth URI。验证器 app 的摄像头读出来的就是它,里面装着算验证码所需的全部参数。理解这串文本,你才能在二维码扫不出来、要在两个 app 之间迁移账户、或者验证码始终对不上的时候自己动手。

otpauth URI 长什么样

它的开头固定是 otpauth://totp/,后面跟标签、再用 ? 接一串参数。一条完整的例子:

otpauth://totp/GitHub:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub&algorithm=SHA1&digits=6&period=30

拆开看:

  • totp 是类型,基于时间的一次性密码,几乎所有服务用的都是它。
  • GitHub:alice@example.com 是标签,冒号前是发行方,冒号后是账户名。
  • secret 是密钥,验证器和服务器共用的那把钥匙。
  • issuer 是发行方,也就是服务名,验证器列表里显示的就是它。
  • algorithmdigitsperiod 分别是 HMAC 算法、位数、周期。

把这串文本生成成二维码,效果和网站给你的官方二维码完全一样。

密钥、发行方、账户:三个字段怎么填

密钥是整条 URI 的核心。otpauth 标准规定它必须写成 Base32(RFC 4648),只用 A 到 Z 和 2 到 7,没有 0、1、8、9,就是为了避免和字母 O、I、B、g 看混。典型长度是 16 或 32 个字符。如果网站只给了你一串裸密钥而没给二维码,你需要的就是把它填进密钥字段。

发行方别漏。我自己踩过的坑是:三个公司账户都用同一个邮箱注册,我建 URI 时图省事没填 issuer,结果验证器列表里三行全显示成同一个裸邮箱,登录时根本分不清哪个码对哪个,只能挨个试。填上发行方,列表里一眼就能看到 GitHub、AWS、内部后台,这一步成本是零,省下的麻烦却很实在。

账户名通常填邮箱或用户名,作用是同一个发行方下区分多个账户。

otpauth URI 和 TOTP 是什么关系

这两个东西经常被混在一起,其实分工很清楚。otpauth URI 是配置,TOTP 是结果。

otpauth URI 描述的是怎么配:用哪个密钥、哪个算法、几位数、多长周期。你扫它,账户才注册进验证器。注册之后,验证器拿着密钥和当前时间,按 TOTP 算法每 30 秒算出一个新的 6 位数,这个数才是你登录时填的验证码。

所以顺序是:先有 otpauth URI 完成配置,再由 TOTP 持续出码。如果你想拿一个已有的 Base32 密钥直接看此刻的验证码,用本站的 TOTP 验证码生成器;如果你要从头拼一条配置 URI 给 app 导入,就用 otpauth URI 生成器

怎么把 URI 导进验证器 app

验证器 app 添加账户基本只认摄像头,不认粘贴文本(1Password、Bitwarden 是少数例外,它们允许直接粘 otpauth:// 字符串)。所以标准流程是:在生成器里拼好 URI,复制出来,丢进二维码工具生成图片,再用手机扫这张图。

一个真实的输入输出例子。你填:

  • 发行方:GitHub
  • 账户:alice@example.com
  • 密钥:JBSWY3DPEHPK3PXP
  • 类型 totp、算法 SHA1、位数 6、周期 30

工具拼出来:

otpauth://totp/GitHub:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub&algorithm=SHA1&digits=6&period=30

把这串复制进二维码生成器扫码,GitHub 这个账户就进了你的验证器。整个过程不上传任何东西,密钥只在浏览器里待着,也不会写进分享链接。

验证码对不上,先查这几个参数

两步验证最常见的故障是码始终错,九成是参数不一致。把出问题的那条 otpauth URI 反向解析回字段,逐项核对:算法是不是被设成了 SHA256 或 SHA512,周期是不是被改成了 60。大多数验证器 app 只完整支持 SHA1,选了更"安全"的算法反而让每个码都错。除非服务文档明确写要 SHA256,否则就保持 SHA1、位数 6、周期 30 这套默认。

密钥里混进空格、小写字母或多出来的冒号也会让钥匙失效,从网页复制时尤其容易带上尾空格。做演示或测试时,别把银行、公司账户的真密钥贴进任何工具,改用随机密钥按钮生成一次性的值,需要再深入校验 HMAC 计算时可以配合 HMAC 生成器 一起看。

看懂了 otpauth URI,两步验证就从一个只能扫码的黑盒,变成你能拆能拼能排错的一串普通文本。


Made by Toolora · Updated 2026-06-13