UDS诊断系列之七 安全访问(27)服务
安全訪問服務(wù),主要功能是為了通過診斷安全地訪問服務(wù)端,也就是ECU,而設(shè)置的一層保護(hù)機(jī)制。
一、安全訪問機(jī)制
1.安全訪問定義
什么是安全地訪問?就是通過一個(gè)驗(yàn)證機(jī)制來確認(rèn)發(fā)送請(qǐng)求的一方是不是官方認(rèn)可的設(shè)備,也就是驗(yàn)證設(shè)備是否可信,驗(yàn)證通過之后才可以繼續(xù)請(qǐng)求服務(wù)端的數(shù)據(jù)。
有哪些是需要安全訪問通過之后才可以進(jìn)行響應(yīng)的呢?主要分為三類,第一類是操控類的服務(wù),例如輸入輸出控制、例程控制服務(wù)等,第二類是寫入類,例如通過DID寫入數(shù)據(jù),軟件更新等,第三類不多見,有些比較重要的數(shù)據(jù)讀取,有時(shí)候也需要先通過安全訪問的驗(yàn)證。
安全訪問主要使用種子和密鑰來進(jìn)行安全驗(yàn)證,驗(yàn)證過程中,通過計(jì)算相同種子得到的密鑰,ECU對(duì)比設(shè)備發(fā)送過來的密鑰和自己的密鑰,來確定設(shè)備是否可信。
這里的算法就是主機(jī)廠定義好的,只有主機(jī)廠授權(quán)的設(shè)備制造商和ECU制造商知道,所以如果雙方使用相同的算法,那么相同種子計(jì)算出來的密鑰必然是相同的,也就驗(yàn)證了設(shè)備出自被授權(quán)的制造商之手。
這就跟間諜對(duì)暗號(hào)一樣,事先約定好,上句是“天王蓋地虎”,下句是“寶塔鎮(zhèn)河妖”,那么交換秘密的時(shí)候,有人先說上句,對(duì)面對(duì)上來下句,身份確認(rèn)完畢。
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)服務(wù)端(ECU)①請(qǐng)求種子②響應(yīng)種子③發(fā)送密鑰④密鑰正確/錯(cuò)誤客戶端(Tester)服務(wù)端(ECU)①客戶端首先發(fā)送請(qǐng)求種子的診斷請(qǐng)求
②服務(wù)端收到請(qǐng)求后,計(jì)算一個(gè)隨機(jī)種子通過診斷響應(yīng)發(fā)送給客戶端
③客戶端收到種子后,使用定義好的算法計(jì)算出密鑰,然后通過診斷請(qǐng)求發(fā)送給服務(wù)端
④服務(wù)端收到密鑰后,與自己計(jì)算的密鑰作對(duì)比,如果一致,驗(yàn)證通過,如果不一致,驗(yàn)證失敗
驗(yàn)證失敗需要響應(yīng)哪些NRC,可參照標(biāo)準(zhǔn)的附錄I,里面有詳細(xì)的狀態(tài)切換圖和響應(yīng)規(guī)則。
需要注意的是請(qǐng)求種子和發(fā)送密鑰兩步操作是通過子功能來區(qū)分的,請(qǐng)求種子的子功能是奇數(shù),發(fā)送密鑰的子功能是偶數(shù),且是請(qǐng)求種子的子功能加1。由此,子功能被分成了一對(duì)對(duì)的組,每一組是一個(gè)安全等級(jí),不同的安全等級(jí)可以用來驗(yàn)證不同的設(shè)備,或者執(zhí)行不同安全等級(jí)要求的操作,數(shù)字大小并不代表其等級(jí)的高低。
同一時(shí)刻最多只能有一個(gè)安全等級(jí)是解鎖的狀態(tài),因此從一個(gè)安全等級(jí)接收到另外一個(gè)等級(jí)的請(qǐng)求并且解鎖成功后,之前的安全等級(jí)將被重新鎖定,而由于切換安全等級(jí)致使先前解鎖的狀態(tài)被鎖定后,其依賴于被鎖定的等級(jí)的服務(wù)和功能也一并被關(guān)閉。
如果被請(qǐng)求的安全等級(jí)當(dāng)前是已經(jīng)解鎖的狀態(tài),那么在響應(yīng)種子時(shí),在放種子的位置都放上0,表示已經(jīng)解鎖了,你不要再請(qǐng)求了。并且實(shí)際上種子應(yīng)該是一個(gè)隨機(jī)數(shù),一般全0和全F都不允許作為普通種子放到響應(yīng)里,全0剛才說了,有特殊含義,全F有可能是寄存器的初始值,這樣就無法分辨程序是否有錯(cuò)誤了。
安全訪問為了增加破解難度,一般會(huì)設(shè)置錯(cuò)誤嘗試次數(shù)和延時(shí)機(jī)制。當(dāng)錯(cuò)誤嘗試超過次數(shù)的限值時(shí),就會(huì)開啟延時(shí),延時(shí)時(shí)間內(nèi),不允許進(jìn)行安全訪問,也就是說請(qǐng)求種子會(huì)一直給否定響應(yīng)。這個(gè)延時(shí)時(shí)間也可以在ECU復(fù)位或者啟動(dòng)的時(shí)候開啟,或者更復(fù)雜一些,設(shè)置錯(cuò)誤計(jì)數(shù)器在非易失寄存器里,上電或者復(fù)位之后要檢查這個(gè)計(jì)數(shù)器,如果超過限值就開啟延時(shí)。通常延時(shí)過了之后只允許再進(jìn)行一次嘗試,也就是計(jì)數(shù)器只減1,只有在安全訪問通過之后才清零。
二、應(yīng)用數(shù)據(jù)格式
1.請(qǐng)求報(bào)文
前面提到流程里有兩對(duì)兒請(qǐng)求和響應(yīng),所以安全訪問的請(qǐng)求報(bào)文有兩個(gè)格式,分別是請(qǐng)求種子和發(fā)送密鑰,兩個(gè)格式很相似。
首先來看請(qǐng)求種子,第一個(gè)字節(jié)是服務(wù)ID0x27,第二個(gè)字節(jié)是子功能,注意這里只有1,3,5等奇數(shù)。后面的securityAccessDataRecord是可選的數(shù)據(jù),標(biāo)準(zhǔn)里給的示例是用來標(biāo)識(shí)客戶端的ID,目前暫未遇到過使用該數(shù)據(jù)的,這個(gè)可以先不用管。
發(fā)送密鑰的請(qǐng)求前兩個(gè)字節(jié)分別是服務(wù)ID0x27和子功能,這里的子功能就是2,4,6等偶數(shù)值啦。因?yàn)槭前l(fā)送密鑰的請(qǐng)求所以子功能后面是需要帶密鑰的,密鑰長(zhǎng)度由主機(jī)廠在開發(fā)需求的時(shí)候進(jìn)行定義,但至少有一個(gè)字節(jié),不然也說不過去。
2.響應(yīng)報(bào)文
響應(yīng)格式就更簡(jiǎn)單啦,包含響應(yīng)的ID0x67(0x27+0x40),以及被請(qǐng)求的子功能。后面的種子是收到請(qǐng)求種子的時(shí)候要在響應(yīng)里給出具體的種子,而如果收到的請(qǐng)求是發(fā)送密鑰,則不需要后面的種子字節(jié)了。
三、數(shù)據(jù)示例
安全訪問服務(wù)雖然流程稍微有些復(fù)雜,但實(shí)際格式并不復(fù)雜,所以我就不去標(biāo)準(zhǔn)里截圖貼在這里了,簡(jiǎn)單貼一個(gè)實(shí)際數(shù)據(jù)的流程圖來給大家說一下數(shù)據(jù)流是怎么樣的。
#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)服務(wù)端(ECU)①請(qǐng)求種子 0x27 0x01②響應(yīng)種子 0x67 0x01 0x01 0x02③發(fā)送密鑰 0x27 0x02 0x03 0x04④密鑰正確 0x67 0x02客戶端(Tester)服務(wù)端(ECU)上圖的示例中,子功能是0x01和0x02這一對(duì),種子是0x0102,密鑰是0x0304,數(shù)據(jù)格式就不解釋啦。
安全訪問服務(wù)的否定響應(yīng)有些復(fù)雜,里面會(huì)涉及不同的規(guī)則,后面再單獨(dú)開一篇來說明如何閱讀附錄I。
UDS文章匯總
總結(jié)
以上是生活随笔為你收集整理的UDS诊断系列之七 安全访问(27)服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优秀开源项目之二:流媒体直播系统Open
- 下一篇: 四芯水晶头电话线的接法