最近家里裝了個aqara的智能門鎖,發(fā)現(xiàn)有個一次性密碼,無需聯(lián)網(wǎng)無需手機連接就可以直接生成一次性密碼,簡直amazing!(其實一點不amazing,盲猜HOTP或者TOTP????,類似于谷歌的authenticator)
HOTP和TOTP
- 首先簡單說下HOTP和TOTP,簡單理解就倆密碼生成算法,事先約定好一個密鑰,然后客戶端服務端用相同規(guī)則來計算,就能得到一致的值了。
- 其中HOTP是根據(jù)計數(shù),即密碼生成次數(shù),比如客戶端第一次生成密鑰那就是 密鑰+次數(shù)通過某算法運算即可得到一個密碼,服務器使用同樣運算就可以了。至于客戶端多生成了幾次,次數(shù)和服務端對不上怎么辦?服務端可以重試??!
- 至于TOTP是根據(jù)時間,即密鑰加時間來計算,比如以30s為一個周期,按30s取整加上密鑰就可以計算出一個密鑰,服務端可以使用同樣的算法進行計算。至于時間不準咋辦,時間不準那就前后幾個周期都算一下,至于差的太多的,那就自己調時間吧。以前很多銀行的什么什么盾應該用的就是這種。
具體詳細的介紹可以看這篇文章(HOTP和TOTP算法圖解)
aqara門鎖一次性密碼分析
現(xiàn)在我們來看這個鎖的一次性密碼

首先,上面這張圖可以看到生成的密碼的特征
- 6位數(shù)
- 一段時間內有效
- 還有一點這張圖可能沒法顯示,就是它在這個時間段內多次生成,可以生成不同的密碼
這問題就來了幾位數(shù)暫時不看,首先一段周期內有效,很像TOTP算法,但第三點這個周期內可以生成很多個不同的密碼,這就大條了,TOTP算法理論上在指定的周期內生成的密碼是一致的,不然服務端就沒法校驗了。不過這點倒是和HOTP可以對得上。
所以?我覺得一種可能方式是通過HOTP+TOTP共同來實現(xiàn)??????!
下面說具體邏輯
首先再來梳理一下
- 這個一次性密鑰有效時間是往后20分鐘然后向下取整
- 周期內可以生成多個不同的密鑰
- 開鎖一次后即失效
第三點開鎖一次就失效完全可以記錄下來這個密鑰被使用過,至于存到ram還是rom暫時不知道,下次拔電池試試,不過這不重要,重點看前兩點。
舉個例子:假設現(xiàn)在是晚上23:06,那么我現(xiàn)在生成一個一次性密鑰,有效時間就是到23:20,我們可以取23:00整的時間戳,加上密鑰通過某算法運算得到一個密鑰。
現(xiàn)在我有了一個密鑰,有效期到23:20,我要去開鎖,假設我開鎖的時候已經(jīng)是23:11分,那么門鎖端怎么校驗呢?首先一樣的邏輯,往前取整到23:10分,取23:10分的密鑰,使用TOTP算法算出密鑰,這時候密鑰必定不對,因為我們生成的密鑰是使用23:00這個時間點的時間戳來生成的;門鎖發(fā)現(xiàn)匹配不上,那么就再往前取整到23:00,這時候就可以算出一致的密鑰,密鑰校驗通過。
下面再來解決多次的問題,關鍵的一張圖來了!嘿嘿?。。?br>

這張圖可以看出來每個時間段最多只能生成8個一次性密碼,那就好辦了,我們在原有的TOTP算法基礎上再加上次數(shù)即 現(xiàn)在是
密鑰+時間戳+次數(shù) 通過某算法即可得到一次性密碼,門鎖校驗時候也可以在上文的基礎上加上次數(shù),所以也就是時間準確的情況下門鎖理論最多嘗試16次即可確定你輸入的密碼到底是對還是不對。這個計算次數(shù)我猜對于嵌入式設備應該是可接受的,因為這個完全可以使用一些相對簡單的算法比如md5,畢竟這個只是生成密鑰,并不是加密。
最后關于時間我發(fā)現(xiàn)手機上生成這個一次性密鑰是需要聯(lián)網(wǎng)的?。。?!
抓包如下圖

第一個請求,報文挺復雜,沒整明白,不過不重要,看名字應該是獲取utc時間的,這樣就可以規(guī)避手機終端時間不準確的問題,第二個請求我也不知道干啥用的。
至此,由aqara這個智能鎖的一次性密鑰所引起的一些想法就告一段落,雖然我說的未必就真的是這款鎖一次性密鑰的實現(xiàn)方式,但我想說的重點還是HOTP和TOTP這兩種算法。挺好玩的兩種算法,實際開發(fā)中遇到一些需要較高安全性的校驗也可以使用一下。