安全访问0x27(Security Access)
- 1. 为什么需要安全访问
- 2. 子功能成对设计
- 3. 报文格式
- 4. 常见NRC
- 5. 解锁后的状态变化
1. 为什么需要安全访问
会话控制解决了"能不能进这个模式"的问题,但还不够。进了 Extended 会话后,写 DID、IO 控制、刷写这些操作还需要另一层保护——证明你有权限。
安全访问就是这层保护:Tester 必须向 ECU 证明"我知道密码",才能做敏感操作。
但 UDS 不是直接发密码(明文传输不安全),而是用种子-密钥(Seed-Key)机制:
- Tester 向 ECU 要一个随机数(Seed)
- ECU 给一个随机数
- Tester 用算法把随机数算成密钥(Key),发回去
- ECU 用同样算法算一遍,对比结果,对了就解锁
每次要的种子是随机的,所以即使有人抓到了这次的种子和密钥,下次也不一样,没法重放攻击。
下面是完整的种子-密钥交互流程:
2. 子功能成对设计
安全访问的子功能是奇偶成对的:
| 等级 | 请求种子(奇数) | 发送密钥(偶数) |
|---|---|---|
| Level 1 | 01 | 02 |
| Level 3 | 03 | 04 |
| Level 5 | 05 | 06 |
| Level 11 | 09 | 0A |
| Level 19 | 0D | 0E |
规律:奇数 = 要种子,偶数 = 发密钥,偶数 = 奇数 + 1。
3. 报文格式
请求种子(Tester ➡ ECU):
27<奇数子功能>种子正响应(ECU ➡ Tester ):
67<奇数子功能><Seed>Seed 长度由 ECU 决定,通常是 4 字节、8 字节或 16 字节。
发送密钥(Tester → ECU):
27<偶数子功能><Key>密钥正响应(ECU ➡ Tester ):
67<偶数子功能>就回一个 SID + 子功能,没数据 = “验证通过,你解锁了”
负响应(ECU➡ Tester ):
7F27<NRC>整体报文交互流程如下:
4. 常见NRC
| NRC | 名称 | 什么意思 | 什么时候遇到 |
|---|---|---|---|
| 0x22 | Conditions Not Correct | 条件不满足 | 比如没进对会话就要解锁 |
| 0x24 | Request Sequence Error | 请求顺序错了 | 没要种子直接发密钥,或用了不配对的子功能 |
| 0x35 | Invalid Key | 密钥错了 | 算法不对、种子过期、密钥截断错误 |
| 0x36 | Exceeded Number Of Attempts | 尝试次数超限 | 连续多次密钥错误,ECU 锁住了 |
| 0x37 | Required Time Delay Not Expired | 延迟未到 | 种子和密钥之间间隔太短,或被锁定后还没到解锁时间 |
5. 解锁后的状态变化
解锁成功后:
- 整个会话期间有效 — 不用每次操作都重新解锁,直到切会话或会话超时
- 开放敏感操作权限 — 写 DID(2E)、IO控制(2F)、刷写(34/36/37)等
- 种子作废 — 解锁成功后种子清掉,要再解锁必须重新要种子