HSM技术精讲(3.9):密码设备独有的“特异功能“

HSM技术精讲(3.9):密码设备独有的“特异功能“
3.9 硬件特征对象密码设备独有的特异功能本文内容摘自本人的开源书《HSM技术书 - 从思想实验到安全基石》 在线阅读/下载hsm-bookgitclone https://github.com/Lularible/hsm-book.git⭐ 如果对您有帮助欢迎 Star 支持也欢迎通过 GitHub Issues 交流讨论。硬件特征对象概述PKCS#11规范第4.3节定义了一种特殊对象类型——硬件特征对象CKO_HW_FEATURE代表密码设备Token的硬件特性。硬件特征对象分类 CKO_HW_FEATURE硬件特征对象类 ├── CKH_CLOCK 时钟对象实时时钟 ├── CKH_MONOTONIC_COUNTER 单调计数器对象 └── CKH_USER_INTERFACE 用户界面对象与其他对象的区别特性普通对象硬件特征对象创建方式C_CreateObject由Token自动创建存储位置Token存储区直接代表硬件功能数量可创建多个每类通常只有1个查找行为默认可见需显式指定CKA_CLASS查找约束使用C_FindObjectsInit查找时硬件特征对象不会被返回除非模板中显式指定CK_OBJECT_CLASS hwClassCKO_HW_FEATURE;CK_ATTRIBUTE template[]{{CKA_CLASS,hwClass,sizeof(hwClass)}};rvC_FindObjectsInit(hSession,template,1);// 只有指定CKO_HW_FEATURE才会返回硬件特征对象设计意图保护旧版本应用程序不会意外发现不理解的新对象类型。时钟对象Clock Object时钟对象CKH_CLOCK代表Token上的实时时钟。时钟对象架构 ┌─────────────────────────────────┐ │ TokenHSM硬件 │ │ │ │ ┌───────────────────────────┐ │ │ │ 实时时钟RTC │ │ │ │ - 硬件时钟芯片 │ │ │ │ - 电池供电断电保持 │ │ │ │ - 高精度时间源 │ │ │ └───────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌───────────────────────────┐ │ │ │ Clock对象 │ │ │ │ CKA_HW_FEATURE_TYPE │ │ │ │ CKH_CLOCK │ │ │ │ CKA_VALUE 时间字符串 │ │ │ └───────────────────────────┘ │ │ │ │ │ ▼ │ │ CK_TOKEN_INFO.utcTime │ │ 同一时钟源 │ └─────────────────────────────────┘属性属性数据类型含义CKA_HW_FEATURE_TYPECK_HW_FEATURE_TYPECKH_CLOCKCKA_VALUECK_CHAR[16]当前时间字符串时间格式YYYYMMDDhhmmssxx格式分解 YYYY - 年份4字符 MM - 月份2字符01-12 DD - 日期2字符01-31 hh - 小时2字符00-23 mm - 分钟2字符00-59 ss - 秒2字符00-59 xx - 保留字段2字符表示时区偏移如00UTC、08东八区 示例2023121514305300 → 2023年12月15日 14:30:53修改时间CK_CHAR newTime[16]2024010100000000;CK_ATTRIBUTE setTime{CKA_VALUE,newTime,16};/* 设置时间需要登录 */rvC_SetAttributeValue(hSession,hClock,setTime,1);if(rvCKR_USER_NOT_LOGGED_IN){// 可能需要SO权限rvC_Login(hSession,CKU_SO,soPin,soPinLen);rvC_SetAttributeValue(hSession,hClock,setTime,1);}安全约束设置时间需要登录Session某些Token要求SOSecurity Officer权限返回CKR_USER_NOT_LOGGED_IN表示权限不足单调计数器对象Monotonic Counter单调计数器CKH_MONOTONIC_COUNTER代表硬件计数器每次读取值都会增加。单调计数器特性 读取前counter_value 12345 读取后counter_value 12346或更大 关键特性 - 保证每次读取都增加 - 增加量不一定为1取决于硬件 - 不能设置、不能回退、不能重置除非C_InitToken属性属性数据类型含义CKA_HW_FEATURE_TYPECK_HW_FEATURE_TYPECKH_MONOTONIC_COUNTERCKA_RESET_ON_INITCK_BBOOLC_InitToken时是否重置CKA_HAS_RESETCK_BBOOL是否曾被重置CKA_VALUEByte array当前计数值大端序重要约束CKA_VALUE只能读取不能设置/* 读取计数器 */CK_BYTE counterValue[8];CK_ATTRIBUTE getValue{CKA_VALUE,counterValue,sizeof(counterValue)};rvC_GetAttributeValue(hSession,hCounter,getValue,1);/* 尝试设置会失败 */CK_BYTE newValue[8]{0};CK_ATTRIBUTE setValue{CKA_VALUE,newValue,sizeof(newValue)};rvC_SetAttributeValue(hSession,hCounter,setValue,1);// 返回CKR_ATTRIBUTE_READ_ONLY单调计数器的安全意义单调计数器是防御重放攻击的关键工具。重放攻击场景 攻击者截获消息 Message_1 {command: 解锁车门, counter: 100, signature: ...} 攻击者重放 Message_2 {command: 解锁车门, counter: 100, signature: ...} ↑ 相同计数器值 → 重放 防御机制 每次收到消息检查counter是否大于上次记录的值 - counter last_counter → 接受更新last_counter - counter last_counter → 拒绝疑似重放攻击车载应用场景车载安全消息序列 ┌───────────────────────────────────────┐ │ Host应用程序 │ │ │ │ 1. 读取HSM单调计数器 │ │ counter 1001 │ │ │ │ 2. 构造安全消息 │ │ message { │ │ command: 解锁车门, │ │ counter: 1001, │ │ timestamp: 当前时间 │ │ } │ │ │ │ 3. HSM签名 │ │ signature Sign(privateKey, │ │ message) │ │ │ │ 4. 发送消息 │ │ → {message, signature} │ └───────────────────────────────────────┘ 接收端验证 - 检查counter是否递增 - 检查签名有效性 - 防止攻击者重放旧消息CKA_RESET_ON_INIT与CKA_HAS_RESET这两个属性控制计数器的生命周期计数器重置场景 场景1正常使用不重置 ┌─────────────────┐ │ Token初始化 │ │ C_InitToken │ → 计数器保持原值 └─────────────────┘ CKA_RESET_ON_INIT FALSE CKA_HAS_RESET FALSE从未重置 场景2强制重置 ┌─────────────────┐ │ Token重新初始化 │ │ C_InitToken │ → 计数器重置为初始值 └─────────────────┘ CKA_RESET_ON_INIT TRUE支持重置 CKA_HAS_RESET TRUE已被重置安全考虑如果CKA_RESET_ON_INIT FALSE计数器值跨Token初始化保持提供更强的防重放能力如果CKA_RESET_ON_INIT TRUE每次C_InitToken会重置可能削弱安全性用户界面对象User Interface用户界面对象CKH_USER_INTERFACE代表Token的人机交互能力。用户界面对象适用场景 传统HSM - 无显示屏、无键盘 - 通过Host计算机操作 智能卡/USB Token - 可能带有PIN输入键盘 - 可能带有小型显示屏 - 用于安全PIN输入 ATM/POS终端 - 大屏幕显示 - 键盘输入 - 用户交互界面属性属性数据类型含义CKA_PIXEL_XCK_ULONGX轴像素分辨率如1280CKA_PIXEL_YCK_ULONGY轴像素分辨率如1024CKA_RESOLUTIONCK_ULONGDPI像素密度CKA_CHAR_ROWSCK_ULONG字符显示行数如24CKA_CHAR_COLUMNSCK_ULONG字符显示列数如80CKA_COLORCK_BBOOL是否支持彩色显示CKA_BITS_PER_PIXELCK_ULONG每像素位数CKA_CHAR_SETSRFC2279 string支持的字符集CKA_ENCODING_METHODSRFC2279 string支持的编码方法CKA_MIME_TYPESRFC2279 string支持的MIME类型车载HSM的硬件特征对象配置车载HSM通常支持以下硬件特征对象车载HSM硬件特征 时钟对象CKH_CLOCK ├── 用途安全消息时间戳 ├── 来源HSM内部RTC ├── 特性断电保持电池供电 └── 精度通常±1秒/天 单调计数器CKH_MONOTONIC_COUNTER ├── 用途防重放攻击 ├── 特性每次读取自增 ├── 存储Flash持久化 └── 重置C_InitToken后可能重置 用户界面对象CKH_USER_INTERFACE ├── 车载HSM通常无显示屏 ├── Host MCU承担显示职责 └── 因此通常不支持此对象典型车规级HSM的配置车规级HSM硬件特征支持 时钟对象 - 通常支持 - 可通过APDU指令读取/设置 - 与安全消息签名关联 单调计数器 - 通常支持 - 用于防重放序列号 - 集成在安全消息协议中 用户界面 - 不支持无显示屏小结硬件特征对象的价值硬件特征对象代表密码设备超越密码的特异功能核心价值回顾 时钟对象 ├── 安全时间戳来源 ├── 证书有效期验证参考 ├── 审计日志时间基准 └── 与CK_TOKEN_INFO.utcTime共享时钟源 单调计数器 ├── 防重放攻击的关键工具 ├── 保证序列号唯一递增 ├── 硬件级别的不可回退 └── 安全消息协议必备 用户界面对象 ├── 安全PIN输入通道 ├── 独立于Host的交互能力 ├── 防止Host端截获PIN └── 智能卡/USB Token常用 设计哲学 - 硬件特征对象映射真实硬件能力 - 不是虚拟对象而是硬件接口 - 扩展PKCS#11的能力边界 - 从密码计算到安全设备这些硬件特征对象让HSM不仅仅是密码计算器而是完整的安全设备。下一节我们将学习初始化函数——看PKCS#11的启动流程。【下集预告】C_Initialize做什么C_Finalize做什么C_GetSlotList怎么用C_InitToken怎么初始化初始化顺序是什么下一节初始化与Slot管理函数。