安全访问服务,主要功能是为了通过诊断安全地访问服务端,也就是ECU,而设置的一层保护机制。

一、安全访问机制

1.安全访问定义

什么是安全地访问?就是通过一个验证机制来确认发送请求的一方是不是官方认可的设备,也就是验证设备是否可信,验证通过之后才可以继续请求服务端的数据。
有哪些是需要安全访问通过之后才可以进行响应的呢?主要分为三类,第一类是操控类的服务,例如输入输出控制、例程控制服务等,第二类是写入类,例如通过DID写入数据,软件更新等,第三类不多见,有些比较重要的数据读取,有时候也需要先通过安全访问的验证。

安全访问主要使用种子和密钥来进行安全验证,验证过程中,通过计算相同种子得到的密钥,ECU对比设备发送过来的密钥和自己的密钥,来确定设备是否可信。
这里的算法就是主机厂定义好的,只有主机厂授权的设备制造商和ECU制造商知道,所以如果双方使用相同的算法,那么相同种子计算出来的密钥必然是相同的,也就验证了设备出自被授权的制造商之手。
这就跟间谍对暗号一样,事先约定好,上句是“天王盖地虎”,下句是“宝塔镇河妖”,那么交换秘密的时候,有人先说上句,对面对上来下句,身份确认完毕。

2.安全访问流程

具体的安全访问流程如下图所示:

#mermaid-svg-uzu2m0HuLwyn43IO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uzu2m0HuLwyn43IO .error-icon{fill:#552222;}#mermaid-svg-uzu2m0HuLwyn43IO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uzu2m0HuLwyn43IO .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-uzu2m0HuLwyn43IO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uzu2m0HuLwyn43IO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uzu2m0HuLwyn43IO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uzu2m0HuLwyn43IO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uzu2m0HuLwyn43IO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uzu2m0HuLwyn43IO .marker.cross{stroke:#333333;}#mermaid-svg-uzu2m0HuLwyn43IO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uzu2m0HuLwyn43IO .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uzu2m0HuLwyn43IO text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-uzu2m0HuLwyn43IO .actor-line{stroke:grey;}#mermaid-svg-uzu2m0HuLwyn43IO .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-uzu2m0HuLwyn43IO .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-uzu2m0HuLwyn43IO #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-uzu2m0HuLwyn43IO .sequenceNumber{fill:white;}#mermaid-svg-uzu2m0HuLwyn43IO #sequencenumber{fill:#333;}#mermaid-svg-uzu2m0HuLwyn43IO #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-uzu2m0HuLwyn43IO .messageText{fill:#333;stroke:#333;}#mermaid-svg-uzu2m0HuLwyn43IO .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uzu2m0HuLwyn43IO .labelText,#mermaid-svg-uzu2m0HuLwyn43IO .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-uzu2m0HuLwyn43IO .loopText,#mermaid-svg-uzu2m0HuLwyn43IO .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-uzu2m0HuLwyn43IO .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-uzu2m0HuLwyn43IO .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-uzu2m0HuLwyn43IO .noteText,#mermaid-svg-uzu2m0HuLwyn43IO .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-uzu2m0HuLwyn43IO .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uzu2m0HuLwyn43IO .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uzu2m0HuLwyn43IO .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uzu2m0HuLwyn43IO .actorPopupMenu{position:absolute;}#mermaid-svg-uzu2m0HuLwyn43IO .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-uzu2m0HuLwyn43IO .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uzu2m0HuLwyn43IO .actor-man circle,#mermaid-svg-uzu2m0HuLwyn43IO line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-uzu2m0HuLwyn43IO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}客户端(Tester)服务端(ECU)①请求种子②响应种子③发送密钥④密钥正确/错误客户端(Tester)服务端(ECU)

①客户端首先发送请求种子的诊断请求
②服务端收到请求后,计算一个随机种子通过诊断响应发送给客户端
③客户端收到种子后,使用定义好的算法计算出密钥,然后通过诊断请求发送给服务端
④服务端收到密钥后,与自己计算的密钥作对比,如果一致,验证通过,如果不一致,验证失败
验证失败需要响应哪些NRC,可参照标准的附录I,里面有详细的状态切换图和响应规则。

需要注意的是请求种子和发送密钥两步操作是通过子功能来区分的,请求种子的子功能是奇数,发送密钥的子功能是偶数,且是请求种子的子功能加1。由此,子功能被分成了一对对的组,每一组是一个安全等级,不同的安全等级可以用来验证不同的设备,或者执行不同安全等级要求的操作,数字大小并不代表其等级的高低。
同一时刻最多只能有一个安全等级是解锁的状态,因此从一个安全等级接收到另外一个等级的请求并且解锁成功后,之前的安全等级将被重新锁定,而由于切换安全等级致使先前解锁的状态被锁定后,其依赖于被锁定的等级的服务和功能也一并被关闭。
如果被请求的安全等级当前是已经解锁的状态,那么在响应种子时,在放种子的位置都放上0,表示已经解锁了,你不要再请求了。并且实际上种子应该是一个随机数,一般全0和全F都不允许作为普通种子放到响应里,全0刚才说了,有特殊含义,全F有可能是寄存器的初始值,这样就无法分辨程序是否有错误了。
安全访问为了增加破解难度,一般会设置错误尝试次数和延时机制。当错误尝试超过次数的限值时,就会开启延时,延时时间内,不允许进行安全访问,也就是说请求种子会一直给否定响应。这个延时时间也可以在ECU复位或者启动的时候开启,或者更复杂一些,设置错误计数器在非易失寄存器里,上电或者复位之后要检查这个计数器,如果超过限值就开启延时。通常延时过了之后只允许再进行一次尝试,也就是计数器只减1,只有在安全访问通过之后才清零。

二、应用数据格式

1.请求报文

前面提到流程里有两对儿请求和响应,所以安全访问的请求报文有两个格式,分别是请求种子和发送密钥,两个格式很相似。
首先来看请求种子,第一个字节是服务ID0x27,第二个字节是子功能,注意这里只有1,3,5等奇数。后面的securityAccessDataRecord是可选的数据,标准里给的示例是用来标识客户端的ID,目前暂未遇到过使用该数据的,这个可以先不用管。

发送密钥的请求前两个字节分别是服务ID0x27和子功能,这里的子功能就是2,4,6等偶数值啦。因为是发送密钥的请求所以子功能后面是需要带密钥的,密钥长度由主机厂在开发需求的时候进行定义,但至少有一个字节,不然也说不过去。

2.响应报文

响应格式就更简单啦,包含响应的ID0x67(0x27+0x40),以及被请求的子功能。后面的种子是收到请求种子的时候要在响应里给出具体的种子,而如果收到的请求是发送密钥,则不需要后面的种子字节了。

三、数据示例

安全访问服务虽然流程稍微有些复杂,但实际格式并不复杂,所以我就不去标准里截图贴在这里了,简单贴一个实际数据的流程图来给大家说一下数据流是怎么样的。

#mermaid-svg-mcycjFDzX8bVpGOD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mcycjFDzX8bVpGOD .error-icon{fill:#552222;}#mermaid-svg-mcycjFDzX8bVpGOD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mcycjFDzX8bVpGOD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-mcycjFDzX8bVpGOD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mcycjFDzX8bVpGOD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mcycjFDzX8bVpGOD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mcycjFDzX8bVpGOD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mcycjFDzX8bVpGOD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mcycjFDzX8bVpGOD .marker.cross{stroke:#333333;}#mermaid-svg-mcycjFDzX8bVpGOD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mcycjFDzX8bVpGOD .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mcycjFDzX8bVpGOD text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-mcycjFDzX8bVpGOD .actor-line{stroke:grey;}#mermaid-svg-mcycjFDzX8bVpGOD .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-mcycjFDzX8bVpGOD .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-mcycjFDzX8bVpGOD #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-mcycjFDzX8bVpGOD .sequenceNumber{fill:white;}#mermaid-svg-mcycjFDzX8bVpGOD #sequencenumber{fill:#333;}#mermaid-svg-mcycjFDzX8bVpGOD #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-mcycjFDzX8bVpGOD .messageText{fill:#333;stroke:#333;}#mermaid-svg-mcycjFDzX8bVpGOD .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mcycjFDzX8bVpGOD .labelText,#mermaid-svg-mcycjFDzX8bVpGOD .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-mcycjFDzX8bVpGOD .loopText,#mermaid-svg-mcycjFDzX8bVpGOD .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-mcycjFDzX8bVpGOD .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-mcycjFDzX8bVpGOD .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-mcycjFDzX8bVpGOD .noteText,#mermaid-svg-mcycjFDzX8bVpGOD .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-mcycjFDzX8bVpGOD .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mcycjFDzX8bVpGOD .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mcycjFDzX8bVpGOD .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mcycjFDzX8bVpGOD .actorPopupMenu{position:absolute;}#mermaid-svg-mcycjFDzX8bVpGOD .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-mcycjFDzX8bVpGOD .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mcycjFDzX8bVpGOD .actor-man circle,#mermaid-svg-mcycjFDzX8bVpGOD line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-mcycjFDzX8bVpGOD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}客户端(Tester)服务端(ECU)①请求种子 0x27 0x01②响应种子 0x67 0x01 0x01 0x02③发送密钥 0x27 0x02 0x03 0x04④密钥正确 0x67 0x02客户端(Tester)服务端(ECU)

上图的示例中,子功能是0x01和0x02这一对,种子是0x0102,密钥是0x0304,数据格式就不解释啦。

安全访问服务的否定响应有些复杂,里面会涉及不同的规则,后面再单独开一篇来说明如何阅读附录I。
UDS文章汇总

UDS诊断系列之七 安全访问(27)服务相关推荐

  1. UDS诊断系列之五 诊断会话控制(10)服务

    诊断会话控制服务,其服务ID是0x10,主要功能为控制服务端的会话模式的切换. 一.诊断会话模式 诊断会话模式分为默认会话模式和非默认会话模式,不同的会话模式所支持的功能.权限.时间参数等等是不一样的 ...

  2. UDS诊断系列之十一 输入输出控制(2F)服务 上

    应粉丝要求,先来更新输入输出控制(2F)服务的内容. 输入输出控制(2F)服务顾名思义就是对输入和输出内容进行控制,这里的输入和输出一般指的是控制器的输入和输出引脚或者设备,例如仪表的各种灯就是仪表控 ...

  3. UDS诊断系列之十 DTC控制(85)服务

    DTC控制服务的主要作用是控制DTC的状态更新. 一.响应规则 DTC=diagnostic trouble code,DTC的状态是故障信息中的一个字节,用来表示故障当前的状态是正在发生还是仅仅发生 ...

  4. UDS诊断系列之三 ISO14229协议介绍(下)

    上篇主要分享了一些基本概念和响应规则,里面提到了否定响应码,也提到了ISO14229-1的附录A是一张否定响应码的表格,里面详细介绍了否定响应码的具体含义.那么在什么时候给出什么样的否定响应码,这篇里 ...

  5. UDS诊断系列之二 ISO14229协议介绍(上)

    ISO14229系列,涵盖了UDS的服务定义以及在各车载总线上的一些特殊应用指导,以及各总线类型所对应的下层协议要求,下面就是该系列中各协议所对应的内容清单. 协议编号 协议名称 协议内容 14229 ...

  6. UDS诊断系列之四 诊断请求和响应

    这一篇重点说一下诊断的请求和响应所包含的信息以及格式要求. 一.诊断数据单元 诊断数据单元一般包含地址信息和应用数据.应用数据长度,其中应用数据会包含服务ID.子功能参数(如果有)和应用数据参数: 1 ...

  7. UDS诊断系列介绍05-27服务

    本文框架 1. 系列介绍 27服务概述 2. 27服务请求与应答 2.1 27服务请求 2.2 27服务肯定应答 2.3 27服务否定应答 1. 系列介绍 UDS(Unified Diagnostic ...

  8. UDS诊断系列介绍08-19服务

    本文框架 1. 系列介绍 1.1 19服务概述 1.2 DTC故障码定义 1.3 DTC状态位 2. 19服务常用子服务 2.1 19 01服务 2.2 19 02服务 2.3 19 04服务 2.4 ...

  9. UDS诊断系列介绍13-31服务

    本文框架 1. 系列介绍 1.1 31服务概述 2. 31服务请求与应答 2.1 31服务请求 2.2 31服务正响应 2.3 31服务否定响应 3. Autosar系列文章快速链接 1. 系列介绍 ...

  10. UDS诊断系列介绍10-28服务

    本文框架 1. 系列介绍 1.1 28服务概述 2. 28服务请求与应答 2.1 28服务请求 2.2 28服务正响应 2.3 否定应答 3. Autosar系列文章快速链接 1. 系列介绍 UDS( ...

最新文章

  1. php amqp扩展安装,php扩展AMQP,安装报错解决
  2. 微服务化的数据库设计与读写分离
  3. Java引用实际上就是指针,下面关于Java的引用的说法正确的是______。
  4. LXC linux容器简介——在操作系统层次上为进程提供的虚拟的执行环境,限制其使用的CPU和mem等资源,底层是linux内核资源管理的cgroups子系统...
  5. Linux学习之系统编程篇:孤儿进程和僵尸进程(描述对象都是子进程)
  6. sql server获取表的所有字段
  7. Android如何分析native代码,使用android-ndk-profiler对native代码进行性能分析
  8. 第四章 单位根检验与章节综训
  9. 初识网络流(EK and Dinic 模板)
  10. 在Java中用SHA1WithRSA创建的签名如何在.NET中验证
  11. 二维码扫码登陆流程设计
  12. mac版 SimHei添加教程
  13. 纯净版PE系统安装全套流程
  14. 卡特彼勒CAT SIS 售后服务系统3D零件图系统软件 2019年最新版
  15. java的程序的创建快捷方式_关于Swing:如何为Java程序创建快捷方式图标
  16. 华为HCIP数通_H12-222_41-80
  17. 拳王虚拟项目公社:新媒体多渠道变现,生财有道?
  18. 阅读笔记:Blindly Assess Image Quality in the Wild Guided by A Self-Adaptive Hyper Network
  19. 商业银行经营特点与三性原则:安全性、流动性、盈利性
  20. 从零开始实现balloon操作系统(0x02) 加载setup模块

热门文章

  1. 先睹为快,Go2 Error 的挣扎之路
  2. FTP服务器是什么意思?FTP服务器怎么搭建?
  3. java毫秒数_Java中的毫秒数
  4. 2017.10.16队内互测——胡策
  5. 销售订单创建BAPI实例(刘欣)
  6. Java LeetCode每日一题-从易到难带你领略算法的魅力(七):Z 字形变换
  7. 梦三国测试服显示连接服务器失败,我的登陆进去以后说与服务器失去连接怎么回事...
  8. 有文化的人吟了一句诗
  9. Tech Talk| Redmi K50 电竞版手机极致散热技术详解
  10. HTML translate 属性