這裡所說的身份認證,指的是狹義上的在計算機及其網絡系統中確認操作者身份的過程,從而確定用戶是否具有訪問或操作某種資源的權限。
之所以要在網際網路中進行身份認證,是為了防止攻擊者假冒你的身份在系統中進行不利於你的操作。試想一下,萬一哪天早晨起來你發現你的支付寶帳號被盜了,你餘額寶裡的錢全沒了,那豈不是虧大了。
只不過,和現實世界不同的是,網絡世界中一切信息都是用一組特定的數據來表示的,計算機只能識別用戶的數字身份,所以對用戶的授權本質上就是針對用戶數字身份的授權。
因此,如何保證操作者的物理身份和數字身份相對應,就成了一個至關重要的議題了,身份認證也因此在網際網路世界中起著舉足輕重的作用了。本文將會介紹目前很多網站常用的一種方式——雙因素認證(也叫兩步驗證,英語:Two-factor authentication,縮寫為 2FA)。
雙因素認證 2FA雖然網絡世界和真實世界對於身份的表示不盡相同,但是對於身份認證的手段與經驗是可以相互借鑑的。在真實世界,對用戶的身份認證基本依據可以分為這三種:
上述三種認證依據被稱為三種「因素」(factor)。因素越多,證明力就越強,身份就越可靠。
因此,在網絡世界中,為了達到更高的身份認證安全性,某些場景會將上面 3 種挑選 2 種混合使用,即雙因素認證。
在支付寶還沒有在中華大地普及的時候,去銀行通常需要準備一個叫「U 盾」的東西,在使用網上銀行時,用戶需要先插上 U 盾,然後再輸入密碼才能登錄網上銀行。在這一操作中,U 盾(you have)+密碼(you know)這兩種因素組合在一起就構成了一個雙因素認證。
只是後來,隨著移動網際網路的普及,手機漸漸成為最離不開人身邊的物品了,於是傳統的「U 盾+密碼」的組合方案就被「手機+密碼」的組合替代了。
現如今,簡訊驗證碼在國內已經成為使用最廣泛的兩步驗證方法之一了,雖然操作方便,不需要安裝額外的 APP,但是驗證碼的下發依賴網絡和運營商信號,有被竊聽的風險。試想一下,如果這種驗證碼的獲取不需要依賴運營商和網絡,哪怕手機處於飛行模式也可以獲取驗證碼,那麼安全性是不是就得到提升了?
而這也就是下面將要說的 TOTP,即「基於時間的一次性密碼(Time-based One-time Password)」。這是目前公認的可靠解決方案,已被納入國際標準。
TOTP流程TOTP 的流程如下:
1.伺服器隨機生成一個的密鑰,並且把這個密鑰保存在資料庫中。2.服務端將該密鑰下發,通常是在頁面上顯示一個二維碼,內容中包含密鑰。3.客戶端掃描二維碼,把密鑰保存在客戶端。4.客戶端每 30 秒使用密鑰和時間戳通過 TOTP 算法生成一個 6 位數字的一次性密碼
其實利用 TOTP 驗證的流程很簡單,這裡也只是介紹,如果想深入了解 TOTP 算法的具體實現過程,可以參考 👉 TOTP: Time-Based One-Time Password Algorithm[1]
通過這種方式生成一次性驗證碼,除去第一次獲取伺服器下發的密鑰外,對網絡並無其他要求了,這樣即使是在離線情況下也可以使用,而且由於由於這種動態生成的密碼通常只會存在 30s,安全性也得到了較大的提升。
只是在實際過程中,肯定要額外考慮一些情況,比如如果有人想要暴力破解驗證碼時,我們可以對驗證的錯誤次數進行限制;抑或是手機端時間和伺服器時間不同步,我們需要通過算法的方式兼容伺服器時間的前後 30s,從而有效的避免細微時間上差異而導致的驗證失敗。
使用現狀目前 TOTP 驗證 App 主要分為兩類:「獨佔類」和「開放類」。所謂獨佔類指的是只支持自家帳戶登錄的兩步驗證,比如 QQ 安全中心、Steam 驗證令牌等。開放類則是一個純粹的兩步驗證 App,通過一個 App 去作為多個網站的驗證器,例如 Google authenticator 就是一個開源的基於 TOTP 原理實現的一個生成一次性密碼的工具。
Google Play Store 上就有許多第三方的基於 TOTP 原理實現的一次性驗證碼工具,只是由於國內用戶使用習慣的問題,除非在一些特殊場合,例如找回密碼時會用到 TOTP 驗證外,其他大多數情況還是會使用簡訊驗證碼的方式,這也算國內外使用習慣的差異了。
總結總的來說,基於 TOTP 機制的兩步驗證 APP 有著比簡訊驗證碼高得多的安全性和相媲美的便利性,是一種能保障用戶財產安全的工具。只是在登錄時會多一步,費時且麻煩,可能會引起用戶的不適。只是在重要數據面前,還是儘量使用兩步驗證吧,不然和 AntDesign 一樣丟了代碼庫可就不好了。
以上就是本文的全部內容了,新年已到,想必大家也都已經復工了,在這裡祝大家新年快樂,牛年大吉 🐂。如果你覺得我的文章對你有所幫助,還希望在新的一年裡可以繼續支持「01 二進位」,你們的支持是我更新原創的最大動力!
References[1] TOTP: Time-Based One-Time Password Algorithm: https://tools.ietf.org/html/rfc6238