某一线城市地铁清分中心ACC在2024年的一次内部审计中发现问题单程票Token密钥自系统投运以来从未轮换过同一密钥已持续使用了6年。更严重的是该密钥以明文形式存储在清分系统的一台数据库服务器配置文件中任何具备服务器登录权限的人员都可以读取。密钥一旦泄露攻击者可以伪造任意面额的单程票Token——每张伪造票卡的价值被清分系统确认并结算。这不是理论风险。2018年国内某地铁就曾发生过单程票Token被破解的事件经调查确认是产线密钥管理环节的泄露导致大量伪造票卡流入市场直接经济损失超过千万元。一、AFC系统的密钥体系地铁AFCAutomatic Fare Collection系统的密钥体系覆盖票卡生命周期、终端设备认证、清分结算安全三大环节。1.1 票卡密钥体系AFC系统使用多层密钥体系保护非接触式票卡MIFARE/CPU卡的数据安全┌────────────────────────────────────────────────────────┐ │ 第1层主控密钥Master Key │ │ ├─ 用途加密保护传输密钥是整个体系的根密钥 │ │ ├─ 存储ACC清分HSM内部永不导出 │ │ └─ 轮换5-10年 │ ├────────────────────────────────────────────────────────┤ │ 第2层传输密钥Transport Key │ │ ├─ 用途在SC车站计算机与终端之间建立安全通道 │ │ ├─ 存储ACC HSM签发→分发到SC和终端SAM模块 │ │ └─ 轮换1-2年 │ ├────────────────────────────────────────────────────────┤ │ 第3层票卡应用密钥Application Key │ │ ├─ 用途票卡文件访问控制控制读写分区权限 │ │ ├─ 类型充值密钥/消费密钥/维护密钥/票务密钥 │ │ ├─ 存储终端SAM模块写入票卡发行时注入 │ │ └─ 轮换按需建议≤2年 │ ├────────────────────────────────────────────────────────┤ │ 第4层卡片种子密钥Card Diversity Key │ │ ├─ 用途每张票卡差异化衍生唯一会话密钥 │ │ ├─ 算法Diversification3DES/SM4-CBC MAC │ │ └─ 存储终端SAM模块票卡芯片 │ └────────────────────────────────────────────────────────┘1.2 票卡密钥衍生Key Diversification为了防止一张票卡被破解→全线票卡被破解AFC系统使用密钥衍生技术每张票卡使用基于其唯一UID衍生的密钥进行通信# 票卡密钥衍生算法MIFARE DESFire EV2/SM4实现importhashlibfromcryptography.hazmat.primitives.ciphersimportCipher,algorithms,modesdefderive_card_key(master_key:bytes,card_uid:bytes,key_slot:int)-bytes: 基于主控密钥卡片UID密钥槽编号衍生出每张卡片的唯一应用密钥 符合ISO/IEC 14443 Type A和GB/T 35787-2017规范 参数: master_key: 16字节主控密钥SM4或3DES card_uid: 7字节卡片唯一UID key_slot: 密钥槽编号0x00充值, 0x01消费, 0x02维护 # Step 1: 构造衍生输入向量# 格式: UID(7B) KeySlot(1B) Padding(8B)input_vectorcard_uidbytes([key_slot])bytes([0x00]*8)# Step 2: SM4-CBC MAC计算cipherCipher(algorithms.SM4(master_key),modes.CBC(bytes(16)))encryptorcipher.encryptor()ciphertextencryptor.update(input_vector)encryptor.finalize()# Step 3: 取MAC前8字节作为派生密钥derived_keyciphertext[:8]returnderived_key# 以同一张卡的两个应用场景为例card_uidbytes.fromhex(04A1B2C3D4E5F6)deposit_keyderive_card_key(master_key,card_uid,0x00)purchase_keyderive_card_key(master_key,card_uid,0x01)print(f充值密钥:{deposit_key.hex()})# 每卡唯一print(f消费密钥:{purchase_key.hex()})# 与充值密钥不同# 即使100万张卡使用同一个主控密钥每张卡的衍生密钥都不相同有了衍生密钥机制攻击者即使破解了一张票卡的通信数据也无法推导出其他票卡的密钥。1.3 SAM模块的安全设计SAMSecure Access Module是AFC终端的安全核心——它负责存储票卡应用密钥执行票卡的认证和交易。┌───────────────────────────────────┐ │ SAM安全模块接触式IC卡 │ │ ┌─────────────────────────────┐ │ │ │ 安全芯片 │ │ │ │ ┌──────┐ ┌──────────┐ │ │ │ │ │密钥存储│ │密码引擎 │ │ │ │ │ │(EPROM)│ │SM4/3DES │ │ │ │ │ └──────┘ └──────────┘ │ │ │ │ ┌──────┐ ┌──────────┐ │ │ │ │ │防攻击 │ │交易缓存 │ │ │ │ │ │(主动屏蔽)│ │(断电保护) │ │ │ │ │ └──────┘ └──────────┘ │ │ │ └─────────────────────────────┘ │ └───────────────────────────────────┘SAM的安全要求密钥在安全芯片内部生成不可读检测到物理攻击温度/电压/频率异常时主动密钥自毁交易日志写入后不可篡改二、清分中心ACC的数据安全2.1 清分结算流程中的数据安全风险ACC是AFC系统的大脑——它接收各线路SC上传的交易数据完成清分结算后将结果下发各线路。每一环的数据安全都不容忽视车站终端 → 车站SC → 线路CC → 清分ACC │ │ │ │ ▼ ▼ ▼ ▼ 交易加密 线路汇聚 清分结算 账单分发 SAM保护 SC本地 ACC数据 CC回执 TDE加密 TDE审计 加密传输风险最大的是SC到CC和CC到ACC两条传输链路——交易数据在此汇聚一条链路上的数据量可达数十万笔/天。2.2 数据库TDE透明加密在清分系统的应用清分中心的数据库存储了全线路的票务数据、结算账单、设备密钥等敏感信息。TDE透明加密为这些数据提供落盘加密保护-- 清分中心数据库的TDE加密配置以MySQL为例-- 1. 创建加密表空间使用SM4算法CREATETABLESPACEacc_data ENCRYPTIONyDEFAULTENCRYPTIONALGORITHMSM4-CBCENGINEInnoDB;-- 2. 将敏感表迁移到加密表空间ALTERTABLEtransaction_logTABLESPACEacc_data;ALTERTABLEsettlement_resultTABLESPACEacc_data;ALTERTABLEdevice_key_configTABLESPACEacc_data;-- 3. 查看加密状态SELECTNAME,SPACE,ENCRYPTIONFROMINFORMATION_SCHEMA.INNODB_TABLESPACESWHEREENCRYPTIONY;-- 输出: 3个表空间已加密, 密钥由KSP统一管理TDE的核心优势在于应用无感知——ACC的清分软件不需要修改一行代码数据库文件在磁盘上即密文即使存储介质被窃取也无法读取数据。2.3 清分结算数据的安全审计每条交易在清分链路中流动时都需要携带完整的审计元数据{transaction_id:ACC-20260714-001-0047291,card_uid_hash:a3f2b1c4...,// 卡UID哈希非明文station_in:SH-01-L2,// 进站车站station_out:SH-15-L2,// 出站车站amount_encrypted:0x7B32...,// 交易金额SM4加密amount_decrypted:4.00,// 仅清分工作人员可查看signature:a1b2c3d4...,// SM2交易签名timestamp:2026-07-14T08:32:10Z,audit_chain:{terminal_id:GATE-SH01-015,sc_signature:...,,// SC级签名cc_signature:...,,// 线路CC级签名acc_signature:...// ACC级签名}}每笔交易从车站终端产生时即使用SAM模块签名一路传递到ACC——任意中间环节篡改数据都会导致签名链断裂审计系统自动告警。三、密钥管理的全生命周期3.1 密钥轮换策略AFC系统密钥轮换的核心难点不是生成新密钥而是新旧密钥的平滑切换——线上的自动售票机、闸机、充值机不能因为密钥轮换而停机。密钥层级轮换周期切换方式影响范围主控密钥5-10年ACC HSM重新签发仅影响上一级SC需重新更新传输密钥传输密钥1-2年SC逐站推送新密钥到终端SAM单站停机窗口5分钟应用密钥≤2年新卡使用新密钥旧卡用旧密钥无中断双密钥共存期≥3个月卡片衍生密钥每次交易实时派生无感其中应用密钥的切换最关键的策略是设置双密钥共存期——新密钥激活后旧密钥保持有效至少3个月确保市场上的旧票卡在有效期内仍可使用。3.2 密钥管理系统的功能映射在AFC系统的实际部署中密钥管理涉及密钥生成、分发、存储、使用、轮换、销毁的全流程AFC密钥管理环节功能需求对应产品能力密钥生成HSM内部生成SM4/3DES密钥对CAS-KMS HSM密钥管理SM2/SM3/SM4/RSA/AES/ECDSA密钥存储加密存储不可明文导出KSP三级密钥体系KEK/DEK/会话密钥密钥分发安全通道传输到SAM模块加密通道TLS 1.3SM2/SM4终端认证SAM模块双因素身份认证ASPUKEY支持FIDO2/UKey/OTP/RADIUS数据加密清分数据库透明加密TDE零改造性能损耗≈3%安全审计全量操作日志不可篡改KSP审计模块Syslog对接防篡改四、AFC系统的安全自检清单检查项验证方法通过标准SAM模块物理安全尝试物理探测SAM芯片引脚检测到攻击时密钥自毁触发票卡密钥唯一性随机抽取1万张票卡验证衍生密钥100%票卡使用不同衍生密钥密钥轮换周期检查KSP平台轮换策略配置传输密钥≤2年应用密钥≤2年清分数据库加密查看数据库文件内容数据文件头显示为SM4密文交易签名链完整性抽取一条完整交易链验签ACC→CC→SC→终端四级签名完整审计日志防篡改尝试修改已归档日志记录签名链断裂立即告警SC-ACC传输加密抓包验证链路TLS套件TLS 1.3SM2/SM4-GCMQ: 票卡密钥轮换时消费者手中的旧票卡会作废吗A: 不会。密钥轮换采用双密钥共存期策略——新密钥激活后旧密钥保持有效至少3个月通常设置6个月。持有旧密钥票卡的消费者在过渡期内仍可正常进出站和结算。过渡期结束后旧卡自然使用寿命到期无需主动回收。但建议在车站公告中告知消费者建议旧卡用完后更换新卡。Q: SAM模块被物理破坏后密钥会泄露吗A: SAM模块符合EAL4安全认证检测到物理攻击探针探测、电压扰动、温度异常、频率扫描时安全芯片会在皮秒级别触发密钥自毁。即使使用聚焦离子束FIB等高级物理分析手段也无法在密钥自毁后读取残余信息。物理破坏后更换SAM模块并重新注入密钥即可恢复。Q: 地铁路网有十几条线路各线路的密钥体系可以统一管理吗A: 可以。通过KSP密钥管理平台的统一管控各线路可以共享第1级主控密钥体系但各线路拥有独立的第2-3级工作密钥和票卡应用密钥。KSP的分级权限模型支持ACC管理员管理全线密钥线路管理员管理本线路密钥的协作模式。某一线城市地铁15条线路已按此模式实现统一密钥管控。