一、27 服务定义
0x27 = SecurityAccess 安全访问服务(ISO 14229 UDS)
作用:
- 给 ECU 加锁
- 敏感操作必须先解锁(刷写、改标定、清故障码、写 VIN 等)
- 用 种子 (Seed) ↔ 密钥 (Key) 动态认证,没有固定密码
二、27 服务核心用法标准流程
-
诊断仪 → ECU:请求种子(RequestSeed)
- 子功能:奇数(01,03,05,07...)
- 示例:
27 05(请求等级 3 种子)
-
ECU → 诊断仪:返回随机种子(Seed)
- 种子:4 字节随机数(常见),每次不一样
- 肯定响应:
67 05 11 22 33 44(67=27 响应)
-
诊断仪:用原厂算法算出 Key
- 输入:Seed
- 算法:车企私有(保密) ,常见:
- XOR / 移位 / S 盒 / AES / HMAC
- 输出:4 字节 Key
-
诊断仪 → ECU:发送密钥(SendKey)
- 子功能:奇数 + 1(偶数)(02,04,06,08...)
- 示例:
27 06 55 66 77 88
-
ECU 验证
- ECU 用相同算法 + 相同 Seed算自己的 Key
- 对比:一样 → 解锁;不一样 → 拒绝(NRC=35)
三、安全等级(常用)
| 等级 | 子功能(请求 / 发送) | 用途 |
|---|---|---|
| Level 1 | 01/02 | 编程会话(刷写程序) |
| Level 2 | 03/04 | 常规维修(清故障码、激活测试) |
| Level 3 | 05/06 | 系统修改(标定、写数据) |
| Level 4 | 07/08 | 厂商核心(改里程、写密钥) |
规则:
- 一次只能解锁一个等级
- 会话超时 / 复位 → 自动重新上锁
四、密钥 / 种子 存储(重点)
1. ECU 内部(核心)
-
密钥算法 + 原始密钥(Secret Key)
- 存储:MCU 内部 OTP / Flash 加密区 / 硬件安全模块 HSM
- 永不公开,不可读,出厂固化
-
当前种子(Seed)
- 存储:RAM(临时)
- 掉电丢失;认证失败 / 超时清空
-
安全状态 / 错误计数器
- 存储:Flash(非易失)
- 作用:防止暴力破解(3 次错 → 锁 10 秒)
2. 诊断仪 / 上位机
- 相同的算法 + 相同的原始密钥
- 存储:加密狗 / 授权文件 / 内部加密存储
- 只有原厂 / 授权设备才有,普通用户拿不到
3. 总结
- 算法和根密钥:存 ECU 加密 Flash / HSM(只读、保密)
- 临时种子:存 RAM(用完即丢)
- 诊断仪:存相同算法 + 根密钥(授权才有)
五、常见否定响应(NRC)
- 35:Key 错误(算法不匹配 / 根密钥不对)
- 36:Seed 过期(太久没发 Key)
- 37:访问被锁定(多次失败,需等 10 秒)
六、实战示例(CAN 报文)
1. 请求种子(等级 3)
发送:27 05
响应:67 05 A1 B2 C3 D4 (Seed=A1B2C3D4)
2. 计算 Key(假设算法:Key=Seed XOR 12345678)
Key = A1B2C3D4 XOR 12345678 = B38695AC
3. 发送密钥
发送:27 06 B3 86 95 AC
响应:67 06 (解锁成功)
七、完整安全机制分层(五大防护设计)
- 种子是随机的每次都变,(防复用)
- 算法 + 根密钥存在 ECU 加密区,读不出来,(隔离保护)
- 错误次数限制,防暴力破解(防爆破)
- 解锁状态临时,复位就失效(时效性保护)
- 报文与交互安全约束(会话约束)
第一层:随机种子防复用
- Seed 由 ECU 内部硬件随机数 / 混沌算法生成
- 每次 0x27 请求种子,种子完全不同
- 种子仅存在 ECU RAM 临时缓存
- 断电、复位、认证失败、超时 → 立即销毁清空
- 旧种子永久失效,截获上一次密钥也没用
👉 解决:抓包回放攻击、旧密码复用。
第二层:根密钥 + 加密算法 隔离保护
-
根密钥(Secret Key)
- 存储位置:
- MCU 内部 OTP 一次性可编程存储
- Flash 加密保护区 / HSM 硬件安全模块
- 部分车厂:硬件唯一密钥,不可读取、不可改写
- 外部诊断、读 Flash、调试接口无法导出根密钥
- 存储位置:
-
加密算法主流:移位、异或、分组加密、AES、自定义置换 S 盒
- 算法固化在 ECU 固件代码里,无公开文档
- 诊断仪 / 原厂工具 必须内置同款算法 + 同款根密钥
- 第三方设备缺密钥 / 算法,无法算出合法 Key
👉 解决:直接破解、逆向抄算法。
第三层:错误次数锁定机制(防爆破)
ECU 内部非易失存储(Flash)保存安全访问错误计数器:
- 密钥错误一次 → 计数器 + 1
- 连续错误 3~5 次 → 安全锁定
- 锁定期间:拒绝所有 0x27 服务,报 NRC=37
- 解锁条件:
- 固定冷却时间(3s/10s/30s)自动解除
- 部分高端 ECU:必须整车断电复位
👉 解决:暴力穷举、逐位试密钥。
第四层:会话绑定 + 时效性限制
- 种子时效性种子下发后,必须在规定时间内(2~5s)发送密钥超时未应答 → 种子作废,需重新申请种子(NRC=36)
- 会话绑定 安全解锁仅当前诊断会话有效
- 切换会话、退出诊断、CAN 总线休眠、ECU 复位
- 立刻自动降级上锁
- 权限分级隔离0x27 分多等级:维修级、标定级、编程刷写级、厂商最高权限高等级密钥不能越级访问,权限隔离。
第五层:报文与交互安全约束
- 必须先进入特定诊断会话(如默认会话 / 编程会话),才允许调用 0x27
- 禁止离线计算密钥:种子来自实时 ECU,无法离线伪造
- 密钥报文不明文固定,随种子动态变化
- 部分车企增加:
- 报文校验和 / CRC
- 诊断仪 ID 白名单
- 双向认证(ECU 也校验诊断仪)
八、总结
27 服务 = 动态密码锁:ECU 给随机挑战码(Seed),双方用相同保密算法算 Key,匹配才解锁;算法和根密钥藏在 ECU 加密 Flash/HSM,临时种子放 RAM。