UDS诊断系列之七 安全访问(27)服务
安全訪問服務,主要功能是為了通過診斷安全地訪問服務端,也就是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)服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优秀开源项目之二:流媒体直播系统Open
- 下一篇: 四芯水晶头电话线的接法