調戲小米手環2之認證原理

小米手環2的連接認證機制

之所以小米手環2沒有1那麼方便調戲,是因爲2中加入了認證機制,如果連接手環的中心設備不能完成認證,手環就會在十幾秒後主動與中心設備斷開連接,即使是在這幾十秒裏也只有對認證有關的characteristic進行操作時,手環纔會應答。下面我簡要分析一下小米手環2的連接認證過程。
包含認證characteristic的service的UUID:0000fee1-0000-1000-8000-00805f9b34fb
認證characteristic的UUID:00000009-0000-3512-2118-0009af100700

  1. 打開手環的認證通知
    獲取認證characteristic的descriptor,並以要求response的方式向descriptor寫入0x01,0x00
  2. 獲取隨機數
    向認證characteristic中以不要求response的方式寫入0x02,0x00。之後手環會把0x10,0x02,0x03+16 bytes的隨機數這一共19bytes的數據以認證Characteristic的notify的形式發送給我們。如何獲取隨機數時出錯,手環會在認證Characteristic的notify中發送0x10,0x02,0x04
    告訴我們出錯了,這時因重新寫入,再獲取一次。
  3. 加密隨機數
    在獲取隨機數之後,我們要用16bytes的key對隨機數進行AES-ECB加密,至於這個key哪來的呢。。。我也不知道,自然是和網絡賬戶有關(打開小米運動時需要先用微信或小米賬戶登錄,並且只要登錄同一賬戶,在不同手機上都可以連接手環,也就是說賬戶與key對應,不過我不確定一個賬戶對應幾個key,如過是我,我就會拿網絡賬號直接算個MD5當成key,這樣是一一對應)。當然這就意味着這個key可以瞎編一個,只要16bytes就行,不過如果你非想知道,那需要打開手機的藍牙日誌,解綁手環,再重新綁定,然後用adb拉取日誌,再用wireshark打開,之後尋找手機與手環認證時的數據包,其中包含着key。包含key的數據包
  4. 發送加密後的數據
    加密隨機數後,我們要把加密後的數據加上0x03,0x00的前綴後再以不要求response的形式把這18 bytes寫回認證Characteristic。這之後手環會將我們對隨機數加密的數據與手環自己用預存在手環中的key加密隨機數後的結果進行比較,如果相同,則認證通過,手環會在認證Characteristic的notify中發送0x10,0x03,0x01告訴我們認證成功。如果不同,則手環仍以notify的方式發送0x10,0x03,0x04告訴我們加密結果不符,這時要麼是我們加密錯誤,要麼是我們的key不正確,這樣就還需下一步驟。小米通過這種機制來區分手環和其對應的手機,以防止周圍有多個手環時配對錯誤。
  5. 發送祕鑰
    針對第4步中key錯誤時,和手環根本從未綁定過(即沒有預存過key)的情況,我們需要向手環發送key來覆蓋(保存)key。將0x01,0x00+16 bytes的key 這一共18 bytes以不要求response的形式寫回認證Characteristic中。(這也就是爲什麼我們能在手機的藍牙日誌中截獲key)這時手環會震動,並顯示要求我們點擊手環上的按鍵,如果招辦,手環會清除原有數據,也就是恢復出廠了。如果我們不管它,它亮一會兒就消停了。(但是這種機制沒有黑名單也沒有超時機制,也就是說我們可以一直髮送key,讓手環震動不停,逼手環主人點一下按鍵,這其實是小米手環2的一個漏洞,或者說不足之處)如果在發送key時出錯,手環會以notify的方式發送0x10,0x02,0x01告訴我們key發送失敗。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章