安全访问服务用于修改存储在内存中的 ECU 数据,在此之前,用户首先必须通过该服务授予访问权限。此服务的目的是提供一种访问信息和/或诊断服务的方法,这些服务因安全、排放或安全原因而受到限制。比如一些用于将例程或信息下载/上传到服务器中,并从服务器中读取特定的内存位置的诊断服务可能需要安全访问。因为下载到服务器中的不当程序或信息无疑可能会损害ECU,或危及车辆遵守排放、违反安全或安保标准。安全访问的机制通过使用种子和密钥来实现。
注意:ECU默认上电后将处于锁定状态,如果出现任何问题或您想写入或读取OEM处于锁定状态的任何数据,则需要使用安全访问服务标识符 (0x27) 解锁ECU才能更改数据。
要解锁车辆中的 ECU,首先,客户端将发送种子请求。对于安全访问,从 0x00 到 0xFF 的子功能可用于不同的安全级别。基本上,所有奇数值都用于种子请求,而下一个偶数值(种子请求安全级别 + 1)将用于通过使用安全访问服务标识符 (0x27) 将安全密钥发送到 ECU 来实现解锁。
如上文所示,为了防止 ECU 被未经授权的人修改,大多数 UDS 服务都被锁定。要访问用于修改 ECU 的服务,用户首先必须通过安全访问服务标识符 (0x27) 授予访问权限。只有通过安全访问服务后,才能使用请求下载和传输数据等服务。使用的安全概念称为“种子和密钥”。
安全访问服务流程:
下表<安全访问服务种子请求帧格式>说明了如何按照上述步骤从客户端向服务器请求种子以解锁 ECU。安全访问服务标识符 (0x27) 主要支持扩展诊断会话,因此在请求之前,要从默认会话跳转到扩展诊断会话的诊断会话。
表1 安全访问服务种子请求帧格式
数据字节 | 参数名称 | 十六进制值 |
---|---|---|
0 | PCI | 0x01-0xFF |
1 | SID: Security Access Request | 0x27 |
2 | SBF: Request Seed | 0x01,03,05-7D(0x00-oxFF之间的所有奇数值) |
3 | Data Record[0] (High Byte) | 0x00 – 0xFF |
n… | Data Record[n] (Low Byte) | 0x00 – 0xFF |
上表定义了使用 UDS 协议中的安全访问服务请求种子时的数据格式。具体例子如下(安全访问种子的CAN 请求报文):
字节 0 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 |
---|---|---|---|---|---|---|---|
0x02 | 0x27 | 0x01 | 0x55 | 0x55 | 0x55 | 0x55 | 0x55 |
响应消息具有响应 SID,如果它是肯定响应,则该参数是请求消息参数的消息 SID+0x40。如果是否定响应,则参数是八个否定响应代码之一。
表2 安全访问服务种子响应帧格式
数据交换 | 参数名称 | 十六进制值 |
---|---|---|
0 | PCI | 0x01-0xFF |
1 | Security Access Response ID | 0x67 |
2 | Request Seed SBF | 0x01,03,05-7D(0x00-oxFF 之间的奇数值) |
3 | Security Seed[High Byte] | 0x00 – 0xFF |
4 | Security Seed[Low Byte] | 0x00 – 0xFF |
上表定义了使用UDS 协议中的安全访问服务标识符 (0x27) 从 ECU 获取种子密钥响应时的数据格式。下面的例子为上述请求种子发送的响应帧。例子中的响应种子密钥是 0x1234,当然根据 OEM 算法实现,它可以是任何数字的组合。(安全访问种子响应的报文)
字节 0 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 |
---|---|---|---|---|---|---|---|
0x04 | 0x67 | 0x01 | 0x12 | 0x34 | 0x55 | 0x55 | 0x55 |
当客户端首先向 ECU 请求种子时,ECU 将接收,并根据 ECU 的行为,将发送肯定或否定响应。如果是肯定响应,那么客户端将收到服务器发送的种子密钥,然后客户端将从ECU发送的种子密钥生成一个安全密钥。客户端将按照下表格式发送此安全密钥:
表3 安全访问服务发送密钥请求帧格式
数据交换 | 参数名称 | 十六进制值 |
---|---|---|
0 | PCI | 0x01-0xFF |
1 | SID: Security Access Request | 0x27 |
2 | SBF: Send Key | 0x02,04,06-7E(0x00-0xFF 之间的偶数值) |
3 | Data Record[0] (High Byte) | 0x00 – 0xFF |
n… | Data Record[n] (Low Byte) | 0x00 – 0xFF |
下面的例子为安全访问sendkey 请求报文:
字节 0 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 |
---|---|---|---|---|---|---|---|
0x06 | 0x27 | 0x02 | 0xA1 | 0xB2 | 0xC3 | 0xD4 | 0x55 |
当客户端将发送带有有效安全密钥的“sendkey”请求消息时,服务器将检查将该密钥与客户端生成的密钥进行比较,如果匹配,则服务器将解锁 ECU。然后在解锁后 ECU 将发送如下表的肯定响应消息。
表 4 安全访问服务种子响应帧格式
数据交换 | 参数名称 | 十六进制值 |
---|---|---|
0 | PCI | 0x01-0xFF |
1 | Security Access Response ID | 0x67 |
2 | Request Seed SBF | 0x01,03,05-7D(0x00-0xFF 之间的奇数值) |
3 | Security Seed[High Byte] | 0x00 – 0xFF |
4 | Security Seed[Low Byte] | 0x00 – 0xFF |
下面的例子为安全访问种子响应报文:
字节 0 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 |
---|---|---|---|---|---|---|---|
0x02 | 0x67 | 0x02 | 0x55 | 0x55 | 0x55 | 0x55 | 0x55 |
它定义了 CAN“sendkey”响应消息。
注意:一旦 ECU 解锁,您就可以从 ECU 读取或写入任何授权数据。但是,如果您在解锁 ECU 后不执行任何任务,则 ECU 将在一段时间后根据 OEM 定义的时间参数自动锁定。
安全访问服务标识符 (0x27) 具有不同的否定响应代码,用于通知用户如果 ECU 中存在任何错误请求或任何故障,ECU 无法成功执行此安全访问服务标识符 (0x27) . 根据此NRC代码,客户可以理解ECU无法正确响应的原因。下面显示了所有安全访问否定响应代码 (NRC)。
下面的例子是否定响应的帧格式(安全访问 NRC 帧):
字节 0 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 |
---|---|---|---|---|---|---|---|
0x02 | 0x7F | 0x22 | 0x55 | 0x55 | 0x55 | 0x55 | 0x55 |
Byte0[02]:这个 PCI 字节定义了单帧和两个字节的数据。
Byte1[7F]:这是一个否定响应服务标识符。它在 ISO14229 标准中定义。
Byte2[22]:这是第二个字节,值为 0x22,这意味着错误是条件不正确。那么这个不满足的条件是什么,如果你想知道那么你需要遵循 OEM 文档,在安全访问服务标识符中实现的条件是什么。