硬件 OTP 令牌和口令卡,在互联网圈子里常被当成「过时」的方案,但金融机构的核心系统里它至今仍是主力。原因不是保守,而是它的密钥生成和存储方式完全不依赖任何外部通道。这正是上一篇短信验证码最大的短板。这一篇讲清楚 HOTP/TOTP 的原理、种子分发这个真正的运维难点,以及为什么「过时论」站不住脚。
这是《金融机构的双因素认证》系列的第三篇。上一篇讲了短信验证码的核心问题:认证强度的上限被一个机构自己完全无法控制的外部流程(电信运营商的核实环节)钳制住了。
硬件动态口令令牌(Token)和口令卡,解决的正是这个问题:密钥从生成到使用的整个过程,都不经过任何外部通道。这一篇讲清楚它的原理(HOTP/TOTP)、种子分发这个真正的运维难点,再解释为什么「硬件 Token 过时论」在金融场景里站不住脚。
硬件动态口令的核心思想很朴素:服务器和令牌各拿着同一份共享密钥(种子,seed),双方各自独立算出同一个动态数字,只要两边算出来的一致,就证明拿着令牌的人确实持有那份密钥。
HOTP(Chen 注:HOTP(HMAC-based One-Time Password)由 IETF RFC 4226 定义,2005 年发布。核心是用 HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)对一个计数器值做哈希运算,取哈希结果的一部分截断成人能读的数字串。) 用一个计数器(counter)作为变化的输入:
是共享密钥, 是计数器值。令牌每生成一次动态码,计数器加 1;服务器每验证一次成功,计数器也跟着加 1。因为哈希函数的性质, 变化一点,输出的哈希值就完全不同,从哈希结果反推出 在计算上不可行。
TOTP(Chen 注:TOTP(Time-based One-Time Password)由 IETF RFC 6238 定义,2011 年发布,是 HOTP 的变体。) 把计数器换成了时间:
是当前 Unix 时间戳, 通常是 0, 是时间窗口长度(常见 30 秒或 60 秒)。令牌不需要和服务器保持通信来同步计数器,只要双方的时钟大致同步,落在同一个时间窗口内,就能算出同一个动态码。这也是为什么市面上大多数硬件 Token 和手机 App(下一篇讲)用的都是 TOTP,而不是 HOTP,前者不需要额外的同步机制(Chen 注:HOTP 的计数器只在实际发生一次动作时才前进,令牌侧和服务器侧各自独立递增,一旦某次没有完整走完验证流程(比如用户按了令牌但没提交),两边就会错位,且不会自动纠正。为此服务器通常要维护一个向前查看窗口(look-ahead window),多试几个后续计数器值来重新对齐。TOTP 用时钟代替计数器,时钟本身连续流逝、双方天然同步,不需要这套专门的重同步机制。)。
口令卡(也叫矩阵卡、挑战应答卡)是硬件动态口令的一种更早期形式,原理甚至不需要密码学哈希函数:卡片上印着一个坐标矩阵,每个坐标对应一个数字。认证时,服务器随机给出几个坐标(如「A3、C7、E2」),用户在卡片上查出对应位置的数字并输入。
口令卡本质上是一份预先分发的一次性密码本(类似于一次性密码簿,one-time pad 思路的简化版),没有密钥推导算法,安全性完全依赖于卡片本身不被复制、不被拍照。它比 HOTP/TOTP 更朴素,但胜在实现和运维成本极低,不需要硬件芯片、不需要电池,一张塑料卡或纸卡就能用。国内一些银行早期的网银盾之外,也有用口令卡作为备用认证手段的先例。它的弱点也很直接:卡片一旦被拍照或复印,安全性荡然无存,而且坐标矩阵的组合数有限,理论上存在被逐步收集拼出全卡内容的风险(尤其挑战坐标重复出现时)。
HOTP/TOTP 的密码学部分并不复杂,真正的挑战在种子(共享密钥)怎么从生产环节安全地送到令牌和服务器两端,且中途不被任何第三方看到。
典型流程:
这条链路上有几个关键的安全要求:
内部落地系统:机构自己是最终使用方,种子分发链路完全在机构自己的控制范围内。常见做法是机构直接向令牌厂商采购,种子通过加密传输直接导入机构自己的认证服务器,令牌通过内部行政渠道(人事部门、IT部门线下发放)交到员工手上。整条链路除了厂商生产环节,其余都在机构自己的信任边界内,这与「内部落地系统信任边界完全在机构自己手里」的场景假设高度吻合。
专线托管端系统:情况更复杂,因为使用令牌的一方(机构)和运行认证服务的一方(托管方)是不同的信任主体。常见模式是托管方统一采购和管理令牌,机构的用户使用的是托管方发放的令牌,种子分发链路的信任完全建立在托管方身上,机构自己无法验证种子分发环节的安全性,只能通过协议约束和审计要求(如要求托管方提供厂商资质证明、种子分发流程的合规审计报告)来管理这层风险。
互联网行业这些年确实在远离硬件 Token,转向手机 App(下一篇的主题)和 Passkey,理由是硬件设备携带不便、丢失后补发周期长、用户体验差。这些理由在面向海量个人用户的互联网场景下确实成立。
但金融机构的内部落地系统和专线托管端系统,前提假设完全不同:
按第 1 篇的三级尺,硬件 OTP 令牌属于 L2(标准级):真正的双因素(密码+持有令牌),因素本身(共享密钥+哈希算法)具备一定抗攻击能力,弱点集中在种子分发这个供应链环节,而不是算法本身或者传输通道。
口令卡的强度略低于 HOTP/TOTP 令牌,它没有密码学哈希函数的保护,纯粹依赖卡片本身的物理保密性,更接近 L1 和 L2 之间的过渡形态,更适合作为备用手段而非主力认证方式。
硬件动态口令令牌之所以在金融行业至今仍是主力,根本原因是它的信任链条不经过任何外部通道,不依赖电信运营商(对比上一篇的短信验证码),也不依赖用户的个人设备(对比下一篇的手机 App)。真正的安全风险集中在种子分发这条供应链上,而这条链路,内部落地系统能完全掌控,专线托管端系统则需要靠协议和审计去管理。
下一篇转向动态口令的软件化版本:手机 App。原理和 HOTP/TOTP 完全一样,但密钥的存储介质从专用硬件芯片变成了通用智能手机。这个介质的变化,会带来多大的强度损失?