動態(tài)口令是什么(口令動態(tài)是什么意思)
上圖是中國銀行的動態(tài)口令牌。中行動態(tài)口令每60秒隨機更新一次,密碼顯示為6位數(shù)字。大家有沒有想過,這種設備是不具備聯(lián)網(wǎng)功能的,那這個隨著時間一直改變的動態(tài)口令密碼,當你在手機app中輸入后,銀行又是怎么知道你這個動態(tài)口令是正確的呢?
我們先看看我們?yōu)槭裁葱枰獎討B(tài)口令,這就得從雙因素驗證說起了。我們一般可以通過三種不同類型的證據(jù)來證明一個人的身份:
秘密信息: 只有用戶知道的信息,比如密碼。私人物品: 比如身份證,銀行卡,鑰匙,手機等。生理特征: 用戶的遺傳特征,比如指紋、人臉、虹膜等。
那么雙因素認證,就是同時認證以上的兩種因素,來確定一個人的身份。舉個例子,你用手機銀行給他人的銀行卡轉賬,那么你需要輸入你的銀行密碼和短信驗證碼;你用到ATM機去轉賬,你需要你的銀行卡和密碼。那有人會說,我支付寶和微信轉賬就只用支付密碼就能轉賬,其實背后并不是這么簡單,一般這些金融公司會根據(jù)你的操作類型和金額大小,用背后強大的風控系統(tǒng)來判斷你需要驗證哪些因素,可感知的,有支付密碼,驗證碼,人臉識別,手機的指紋識別,iPhone的face id等。感知不到的還有軟動態(tài)口令,類似上圖的應該的物理動態(tài)口令,你的app會像物理動態(tài)口令一樣,每隔30秒或60秒,就生成一個動態(tài)口令碼,這個動態(tài)口令是根據(jù)你的app上的動態(tài)口令密鑰生成的,這個密鑰會在你登錄成功后下發(fā)到你的app中,當然登錄時候經(jīng)過了雙因素驗證確保是你本人在使用手機。
下圖是第三方的軟動態(tài)口令Google Authenticator OTP,這個口令一樣是根據(jù)時間在改變的,OTP就是一次性密碼(One Time Password)的縮寫。這種軟動態(tài)口令在國外用的會比較多。
有了以上的鋪墊,我們回到我們一開始的問題,動態(tài)口令是怎么離線生成的呢?
首先,服務器會生成一個密鑰,這個密鑰會通過安全的方式保存到用戶的手機,可以是用戶掃碼綁定,也可以是驗證用戶身份后加密下發(fā)到用戶的手機中,這時候,用戶和服務器就有了同一把密鑰。這個密鑰是和手機綁定的,如果用戶更換手機,那么舊密鑰就會失效。同樣的,上面提到的中國銀行的動態(tài)口令設備就是在設備上保存著和服務器中一樣的密鑰,然后這個動態(tài)口令設備會在銀行網(wǎng)點交到用戶的手中。
接著,在需要用到動態(tài)口令的時候,手機端或者動態(tài)口令設備,會使用密鑰和當前時間計算出來一個哈希值,再通過這個哈希值算出個6位數(shù)字的密碼,有效時間是30秒或者60秒,用戶在有效時間內(nèi)將這個哈希值提交給服務器,然后服務器也會用同樣的密鑰和當前時間計算出來一個哈希值,比計算出6位數(shù)字的密碼,比對兩個6位密碼,如果相同則說明動態(tài)口令正確。
那這個有效時間是怎么實現(xiàn)的呢,其實也很簡單,我簡單舉個例子大家就明白了,以有效時間為60秒為例,比如說現(xiàn)在是1900年1月1日 0時0分0秒,那么我們就讓0時0分0秒到0時1分0秒的時間內(nèi)生成的時間值為0,0時1分0秒到0時2分0秒的時間內(nèi)生成的時間值為1,0時2分0秒到0時3分0秒的時間內(nèi)生成的時間值為2,依次類推。有技術背景的朋友相信看到下面計算也能很快明白,時間值 = Date.now() / 1000 / 60 。
上面的這個算法,其實有個官方的名字,叫TOTP (Time-Based One Time Password)。另外還有一個算法叫HOTP(HMAC-BasedOne Time Password),是通過某個事件的特定次序及相同密鑰作為輸入來進行哈希計算得到密鑰,每次驗證后,事件的計數(shù)器都會加一,由于篇幅關系這里就不展開講了,有興趣的可以自己去了解一下。
如果本文對你有幫助,歡迎大家點贊關注收藏。作為一名具有極客精神的程序員,我會持續(xù)地給大家分享一些個人的開發(fā)經(jīng)驗和技術文章,若能幫助到你,那將是我莫大的榮幸。大家也可以關注我的同名微信公眾號“三易程序員”,文章會在公眾號和頭條號同步更新,也歡迎大家私信探討技術問題。