一、原理与数学逻辑
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位时)
- ID末端补0至128位的整数倍,分成 ID1、ID2、...、IDm。
- 第一组:SM4(ID1, K) → S1。
- 第二组:SM4( (S1 + ID2) 算术加,K ) → S2(高位溢出舍去)。
- 以此类推,最终 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功能模块(易考)
- 系统登录认证(分权限)
- 用户管理(角色分配:系统管理员、密钥管理操作员、种子密钥生成员、令牌生成操作员)
- 保护密钥管理(Km/Kt生成、备份、更新)
- 令牌序列号管理
- 种子密钥生成(硬件设备内)与加密导出
- 令牌生产配置(将种子、序列号写入令牌)
- 系统日志(所有操作审计)
种子密钥全生命周期安全控制
| 阶段 |
安全要求 |
| 生成 |
必须在硬件密码设备内部生成 |
| 传输 |
采用加密方式 + 安全通道传输 |
| 写入令牌 |
必须在封闭、无网络的安全环境中进行;保证写入物理线路安全;写入后令牌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)。 |
| 种子密钥写入为何必须在无网络环境? |
防止在生产过程中,种子密钥被通过网络侧泄露或远程攻击窃取,确保物理层面的绝对隔离。 |