动态口令密码应用技术规范

一、原理与数学逻辑

1. 认证基本原理

  • 核心思想:用户端(令牌)与认证服务端基于相同的种子密钥(K)相同的动态因子,采用相同的算法(SM3/SM4),各自生成动态口令,服务端比对完成认证。
  • 关键:种子密钥只有双方持有,永不传输。

2. 动态口令生成公式(五步法)

步骤 公式/操作 说明
因子组装 \(ID = T \mid C \mid Q\) T(时间因子,8字节)、C(事件因子,4字节)、Q(挑战因子,ASCII,最小4字节)。至少包含T或C,Q可选。顺序固定为 T|C|Q,未含参数由后续补位
ID补齐 ID最小长度 128比特,不足末端填0 如ID由T、Q组成,则组装为 T|Q
核心运算 \(S = F(K, ID)\) K:种子密钥(≥128比特);F():SM4(输出128位)或SM3(输出256位)
截位 \(OD = Truncate(S)\) 将杂凑/加密结果截为32位整数(具体算法详见下方SM4截位)
取模输出 \(P = OD \bmod (10^N)\) N为显示位数(N≥6),P为最终显示的动态口令

时间因子计算\(T = T0 / Tc\),其中T0为UTC起始时间(8字节整数),Tc为变化周期(秒,最大60s)。

3. SM4分组运算细节(当ID > 128位时)

  1. ID末端补0至128位的整数倍,分成 ID1、ID2、...、IDm。
  2. 第一组:SM4(ID1, K) → S1。
  3. 第二组:SM4( (S1 + ID2) 算术加,K ) → S2(高位溢出舍去)。
  4. 以此类推,最终 S = Sm

4. SM4截位算法(Truncate)

定义 S1~S4 为4个32位整数,从S中按字节拼接赋值:

  • S1 = S[0]<<24 | S[1]<<16 | S[2]<<8 | S[3] ……(以此类推至S4)
  • 最终\(OD = (S1 + S2 + S3 + S4) \bmod 2^{32}\)

二、系统架构与组件角色

整体架构图(逻辑分层)

层级 组件 功能简述
客户端 动态令牌 生成动态口令的硬件/软件设备,内部存储种子密钥
服务端 认证系统 执行口令认证、令牌同步、状态管理,向应用系统提供API
服务端 密钥管理系统(KMS) 负责种子密钥的生成、加密存储、安全传输和全生命周期管理
业务层 应用系统 集成认证接口,向认证系统转发用户提交的口令进行验证

三、认证系统(服务端)核心机制

1. 令牌生命周期状态(必记流转)

未激活(出厂) → 就绪(正常工作) ↔ 锁定(连续错误/攻击) / 挂起(人工) → 作废

2. 令牌系统数据安全要求

数据类型 安全措施
密钥数据(种子密钥) 加密存储(必须)
其他系统数据(序列号、状态、时间、偏移量等) 完整性校验机制(如MAC/数字签名)

3. 认证系统服务分类

(1)安全服务

  • 动态口令认证:验证用户提交的动态口令。
  • 挑战应答认证
    • 外部挑战:用户将服务端下发的挑战码输入令牌,获取口令。
    • 内部挑战:用户输入PIN/静态口令等私有数据,获取口令(实质是“你所知”因素)。

(2)管理服务

  • 生命周期管理:激活、锁定、挂起、作废

4. 认证系统安全要求(测评重点)

安全要求 具体内容
接入控制 认证服务器应控制应用服务的合法接入
通讯敏感字段加密 认证服务器与应用服务器间的认证数据需加密(防网络窃听)
信息存储加密 种子密钥在数据库中必须密文存储;认证时先解密再计算比对
令牌安全性控制 防重复认证(防重放)、连续错误锁定/解锁、日志安全
自身物理/环境安全 认证系统所在硬件需满足物理安全和环境安全要求

四、密钥管理体系(重中之重:层次化密钥结构)

密钥层次总览(自上而下派生)

密钥名称 符号 生成/来源 用途 存储形式
主密钥 Km 多人分持成分,在硬件密码设备内合成(国密批准方法) 根密钥,派生Kp和Ks 硬件设备内,备份拆分为多张智能卡或多份封存成分
厂商生产主密钥 Kp 由Km与厂商代码派生,经传输密钥Kt加密后提供给厂商 用于生产环节派生Kps 存储在厂商硬件密码设备中,多人管理
传输密钥 Kt 临时随机生成,用于导出Kp时 加密保护Kp在设备间交换 临时,输出时拆分为多个成分,导入时重新合成
种子密钥加密密钥(认证端) Ks 由Km与令牌序列号在硬件内派生 加密该令牌的种子密钥(存储/传输) 临时密钥,不存储(用完即丢)
种子密钥加密密钥(生产端) Kps 由Kp与令牌序列号在硬件内派生 同Ks,用于生产端加密种子密钥 临时密钥,不存储

关键理解:Ks和Kps并非存储的固定密钥,而是由主密钥(或Kp)结合令牌序列号实时计算得出的临时派生密钥。这极大降低了密钥泄露风险。

KMS功能模块(易考)

  1. 系统登录认证(分权限)
  2. 用户管理(角色分配:系统管理员、密钥管理操作员、种子密钥生成员、令牌生成操作员
  3. 保护密钥管理(Km/Kt生成、备份、更新)
  4. 令牌序列号管理
  5. 种子密钥生成(硬件设备内)与加密导出
  6. 令牌生产配置(将种子、序列号写入令牌)
  7. 系统日志(所有操作审计)

种子密钥全生命周期安全控制

阶段 安全要求
生成 必须在硬件密码设备内部生成
传输 采用加密方式 + 安全通道传输
写入令牌 必须在封闭、无网络的安全环境中进行;保证写入物理线路安全;写入后令牌I/O口立即失效
使用(计算) 计算过程全部在硬件设备/芯片安全区域内完成,杜绝内存明文暴露

五、动态令牌(客户端)安全特性(测评重点)

1. 种子密钥本地保护

  • 种子密钥单向导入(或内部生成),绝对不能导出令牌外部。
  • 种子密钥的加密、存储、计算全在芯片安全区域内完成。

2. 芯片与物理安全(防物理攻击)

安全机制 说明
核准安全芯片 必须使用国密局批准型号的芯片
低电压检测 防止电压故障注入攻击
I/O端口失效 种子导入后,通讯I/O端口立即失效,禁止输入/输出任何敏感信息(K/T/C等)
防物理读出 无法通过调试接口、程序篡改等手段读出密钥
掉电自动销毁 芯片掉电时,种子密钥自动销毁
抗旁路攻击 具备抗时间分析、功耗分析(SPA/DPA)、电磁分析等能力
环境异常保护 外部环境(温度、电压等)变化时,不泄露敏感信息,不影响安全功能

3. 使用安全(PIN保护)

  • 具有数字/功能按键的令牌,必须具有PIN保护功能
  • PIN应具备防暴力穷举机制(如连续错误锁定)。

六、测评要点与方法论

服务端(认证系统 + KMS)测评关注点

  • 存储安全:检查种子密钥是否密文存储;尝试直接读数据库,应不可获取明文。
  • 通讯安全:抓取认证服务器与应用系统间的网络包,确认敏感字段已加密。
  • 防重放:重复提交同一动态口令,系统应拒绝。
  • 状态流转:测试连续输错口令,令牌状态是否从“就绪”转入“锁定”。
  • 权限分离:验证KMS各角色(管理员/操作员/生成员)是否只能执行授权操作,无法越权。
  • 密钥派生:验证Ks/Kps是否由主密钥+序列号实时派生,而非固定存储(查阅文档与代码逻辑)。

客户端(令牌)测评关注点

  • 密钥不可导出性:尝试通过物理探针、调试接口、JTAG等方式读取芯片存储区,均不能获取种子密钥。
  • I/O失效验证:种子导入后,尝试通过原有I/O口读取数据或写入指令,均应失败。
  • 掉电测试:掉电后重新上电,检查种子密钥是否已销毁,无法恢复。
  • PIN暴力破解:连续输入错误PIN,验证令牌是否锁定。
  • 环境异常:调节电压/温度至超出规格范围,观察芯片是否会输出敏感信息或功能异常(应保护或自毁)。

七、常见考试问答与答题要点

可能问题 答题核心要点
动态口令为什么是安全的? 种子密钥不同步、不传输;口令一次有效且有时效性(时间型)或使用计数(事件型);基于国密SM3/SM4算法保护。
时间型与事件型的区别 时间型基于T因子(60秒变化),需时间同步;事件型基于C因子(计数器递增),无需时间同步,但需解决窗口同步问题。
为什么Ks和Kps不存储? 由主密钥+令牌序列号实时派生,极大缩小了密钥暴露面,即使序列号泄露也无法逆推主密钥。
Kt为什么要临时生成并拆分? 保护Kp在设备间传输时不被窃取。拆分(M个成分)实现多人控制,避免单点权限过大导致Kp泄露。
令牌I/O端口为何要失效? 防止种子密钥注入后,攻击者通过同一接口逆向读取密钥或注入恶意指令。实现“一次写入,终身只读(且不可读)”。
软件令牌能达到硬件令牌的安全级别吗? 不能。软件令牌的种子密钥存在于通用OS内存中,易被恶意程序读取,无法实现硬件令牌的物理防护(抗探针、旁路、掉电销毁等)。
挑战认证与普通口令认证的区别 挑战认证引入了动态Q因子(外部挑战或内部PIN),增强了抗重放和抗中间人攻击能力,且内部挑战实质是双因素(令牌+PIN)。
种子密钥写入为何必须在无网络环境? 防止在生产过程中,种子密钥被通过网络侧泄露或远程攻击窃取,确保物理层面的绝对隔离。
posted @ 2026-06-28 19:54  lumiere_nebula  阅读(57)  评论(0)    收藏  举报