BLE藍牙的連接和配對過程

一 連接

連接過程參考:
https://blog.csdn.net/iini01/article/details/80147232

二 配對

區別於傳統藍牙的配對過程,BLE的配對過程發生在連接過程之後

配對是一個三階段的過程。前兩個階段是必須的,第三階段是可選的。

  • 第一階段:配對特徵交換
  • 第二階段:短期祕鑰(STK)生成
  • 第三階段: 傳輸特定祕鑰分配

image

image

STK生成規則

  1. Just work: 沒有加密 TK=0x00
  2. passkey entry: 密碼輸入如果 passkey 是 ‘019655’ TK的值就是0x00000000000000000000000000004CC7。
    將輸入的值作爲一個6位數的十進制,轉換成16字節的十六進制。
  3. OOB: 帶外的TK值是一個16字節的隨機數,通過非BLE的方式傳遞給對端。

2.1 第一階段

設備首先在配對特徵交換階段交換IO能力來決定在第二階段使用下面哪種方法:

  • JustWorks:只工作
  • PasskeyEntry:輸入密碼
  • OutOfBand(OOB):帶外

LE Legacy Pairing - Just Works
Just Works方式不能抵抗竊聽者和中間人攻擊,只有在配對過程時沒有遭受攻擊,後面加密的鏈路的數據傳輸纔是可信的。安全級別很低。

LE Legacy Pairing - Passkey Entry
這種方式通過輸入6位數字的方式來進行配對,生成STK。6位數是隨機產生的在000000到999999之間的數值,這個數值相當於一個TK,比如遠端顯示這個數字,需要在本地端輸入這個數字給本地設備與遠端配對。如輸入019655,那此時的臨時Key–TK是:0x00000000000000000000000000004CC7。

Out of Band 帶外
這種方式是通過BLE之外的,設備上的其他方式來獲取這個OOB data,比如通過IR紅外,或其餘的方式,因此對於藍牙竊聽者/攻擊者而言這個data的傳輸是不可見的了,因此會顯得要安全些。

2.1.1 配對請求的數據格式

image

1. IO capabilities表明輸入,輸出的能力

輸入是按鍵、鍵盤,輸出是顯示數字用的界面。

  • 0x00 DisplayOnly 只能是顯示000000 ~ 999999的數字
  • 0x01 DisplayYesNo 顯示Yes/No 的按鈕
  • 0x02 KeyboardOnly 只能是輸入000000 ~ 999999的數字
  • 0x03 NoinputNoOutput 沒有輸入也沒有顯示,只能用Just work工作方式
  • 0x04 KeyboardDisplay 能輸入000000 ~ 999999的數字和輸出

2. OOB data flag

  • 0x00 OOB 數據沒有發送
  • 0x01 OOB 數據通過遠端設備發送(如IR)
  • 0x02-0xFF 保留

3. 身份驗證請求

image

  • Bonding_Flags b1b0 Bonding Type

    • 00 No Bonding
    • 01 Bonding
    • 10 Reserved
    • 11 Reserved
  • MITM

MITM域設置爲1爲請求MITM(中間人介入)保護,否則設置爲0. 設備將標誌設置爲1爲STK請求認證的安全屬性。
選擇Key生成的方法
如果auth Req中MITM沒有,則說明不需要人蔘與中間,所以IO capabilities會被忽略,只用Just Works就OK了。
如果有OOB data,auth Req將可直接忽略,會直接選擇OOB的方式了。

  • SC

SC字段是一個1位標誌,設置爲1以請求LE安全連接配對,否則應根據發起方和響應方支持的功能將其設置爲0,可能的結果配對機制爲:如果兩個設備均支持 LE安全連接,使用LE安全連接; 否則,請使用LE舊式配對。

  • Keypress

keypress字段是一個1位標誌,僅在Passkey Entry協議中使用,而在其他協議中將被忽略。 當雙方將該字段設置爲1時,應使用SMP配對按鍵通知PDU生成併發送按鍵通知。

4. MaximumEncryptionKeySize

最大祕鑰長度,7到16字節之間

5. InitiatorKeyDistribution

發起者的祕鑰分配,該域表明祕鑰初始化設備請求分配使用。

配對請求命令中的“生成”字段由主機使用,以請求發起者向響應者分發或生成哪些密鑰。

6. ResponderKeyDistribution

響應者的祕鑰分配,該字段表明祕鑰初始化設備請求響應設備來分配祕鑰分配使用。

2.1.2 配對請求實例

image

1. Code (1 octet)

0x01 Pairing Request

2. IO Capability (1 octet)

0x03 NoInputNoOutput: 用just work 認證方式

3. OOB data

0x00 OOB(out of band)
沒有帶外認證, 帶外這種方式是通過BLE之外的,設備上的其他方式來獲取這個OOB data,比如通過IR紅外,或其餘的方式,因此對於藍牙竊聽者/攻擊者而言這個data的傳輸是不可見的了,因此會顯得要安全些。

4. AuthReq (1 octet)

AuthReq字段是一個位字段,指示STK和LTK以及GAP綁定信息的請求安全屬性
0x01 :表示綁定

5. MaxEncKeySize

0x10 表示最大認證key大小是0x10個字節

6. InitiatorKeyDistribution

該域表明祕鑰初始化設備請求分配祕鑰分配使用。

7. ResponderKeyDistribution

001 該字段表明祕鑰初始化設備請求響應設備來分配祕鑰分配使用。

2.1.3 從設備向主設備向發送配對回覆報文

image

具體字段含義參考 配對請求報文。

2.2 第二階段

2.2.1 配對確認

第一階段的配對特徵交換成功之後,用來啓動STK生成。該命令被兩個對等設備使用,來向對等設備發送確認值。初始化設備通過向響應設備發送配對確認命令啓動STK生成。

報文格式
image

啓動STK的生成,這一部分可簡述爲以下步驟的實現

  1. Initiator生成128-bit隨機數Mrand,並使用這個Mrand結合一些其他的輸入,使用密碼工具箱中c1計算出一個128-bit的Mconfirm值:
Mconfirm = c1(TK, Mrand,
Pairing Request command, Pairing Response command,
initiating device address type, initiating device address,
responding device address type, responding device address)

Responder也生成一個128-bit隨機數Srand,並使用這個Srand結合一些其他的輸入,使用密碼工具箱中c1計算出一個128-bit的Sconfirm值:

Sconfirm = c1(TK, Srand,
Pairing Request command, Pairing Response command,
initiating device address type, initiating device address,
responding device address type, responding device address)
  1. Initiator將其計算的Mconfirm值通過Pairing Confirm包發送給Responder,而Responder也將其計算的Sconfirm值通過Pairing Confirm包發送給Initiator;
  2. Initiator收到Sconfirm後,再將Mrand值通過Pairing Random包發送給Responder;
  3. Responder收到Mrand值後計算它的Mconfirm值,再跟前面那個Initiator送過來的Mconfirm值進行比較,若不同說明配對失敗了。若相同,則Responder也會將它的Srand值通過Pairing Random包發送給Initiator;
  4. 而Initiator也會計算收到的Srand值的Sconfirm值,並跟前面那個Responder送過來的Sconfirm值進行比較,若不同說明配對失敗了,若相同,繼續。

報文實例

主設備向從設備發送配對確認報文,從設備也向主設備發送配對確認報文。

image

image

2.2.2 隨機配對

該命令用來由初始化和響應設備發送,用來計算在配對確認命令中的確認值的隨機數。

報文數據格式
image

報文實例

主設備向從設備發送配對隨機值報文,從設備也向主設備發送配對隨機值報文。
image

image

2.3 第三階段

2.3.1 傳輸特定的密鑰分發

所有的鍵和值都由主從設備分發。

要分發的密鑰由配對請求和配對響應的密鑰分發參數決定,
配對請求和配對響應來自第一階段配對特徵交換
image

BLE的SMP的一些Key相關定義

  1. Long Term Key (LTK):加密鏈路用,128-bit;

  2. Encrypted Diversifier (EDIV):在LE legacy pairing過程中,用於識別LTK分發,16-bit;

  3. Random Number (Rand):在LE legacy pairing過程中,用於識別LTK分發,64-bit。

  4. Identity Resolving Key (IRK):用於生成和解析random address用的,128-bit;

  5. AddrType (1 octet)
    如果BD_ADDR是公共設備地址,則AddrType應設置爲0x00。
    如果BD_ADDR是靜態隨機設備地址,則AddrType應設置爲0x01。
    BD_ADDR(6個八位字節)此字段設置爲分發設備的公共設備地址或靜態隨機地址。

  6. Connection Signature Resolving Key (CSRK):用於對數據進行簽名已經驗證簽名數據,128-bit;

2.3.2 特定key分發原因

密鑰分發階段的從設備將密鑰發送給主設備,這樣就可以對重新連接進行加密,並解析其隨機地址。或者,主設備可以驗證來自從設備的簽名數據,主設備也可以向從設備提供密鑰,這樣,如果角色互換,可以對重連接進行加密,可以解析主設備的隨機地址,或者從設備可以驗證來自主設備的簽名數據。

三 綁定

就是將配對階段產生的一系列key 保持到flash中,以便後續使用。

以上這個過程的報文交互如下圖,
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章