什麼是兩步認證
在介紹兩步認證以前,首先來看下目前主流的幾種認證方式。html
上圖中的認證方式大致上能夠分爲三大類java
1.You know : 好比密碼,這種只有咱們知道的android
2.You are : 好比指紋,這種只有咱們擁有的ios
3.You have : 好比信用卡,這種只屬於你的git
瞭解上面所說的三大類以後,咱們就很容易的理解下面幾點。github
什麼是兩步認證?
兩步驗證,對應的英文是 Two-factor Authentication(2FA),從名字能夠看出,「兩步」是 2FA 的重點,而兩步就是咱們上面所提到的 You know + You Have ,也就是 密碼 + 一次性密碼(One Time Password,OTP)算法
爲何咱們須要兩步驗證?
傳統的密碼認證方式,若是在用戶名密碼在其餘網站上泄露,任何用戶均可以使用你的帳號密碼進行登錄作任何操做。但有了兩步認證就能在必定程度上有效的避免這種狀況的發生。由於在每次登陸時,不只須要輸入您的賬戶密碼,還需輸入移動設備爲您生成的一次性動態驗證碼數據庫
OTP
前面說過,2FA 中使用的是一次性密碼(One Time Password,OTP),也被稱做動態密碼。通常 OTP 有兩種策略:HOTP ( HMAC-based One Time Password) 和TOTP ( Time-based One-time Password) 。目前被普遍使用的正是後者這種基於時間的動態密碼生成策略。api
算法大致是這樣:安全
- 客戶端和服務器事先協商好一個SECRET,用於一次性密碼的生成過程,此密鑰不被任何第三方所知道。此外,客戶端和服務器都採用時間作計數器。
- 客戶端對密鑰和計數器的組合(SECRET,time/30)使用HMAC(Hash-based Message Authentication Code)算法計算一次性密碼,公式以下:HMAC-SHA-1(SECRET, time/30)
- 各類算法加特效後成6位數字
在這裏就只簡要介紹該算法,如想深刻了解
==> https://tools.ietf.org/html/rfc6238
基於TOTP的密碼有以下特色
- 無需記憶,不會產生password這樣的泄漏問題
- 動態生成,每30s生成一個,安全性大大提升
- 對網絡無要求,離線下仍可正常使用
- 成本低,無需購買硬件和軟件
兩步認證流程
- 服務器隨機生成一個相似於『DPI45HKISEXU6HG7』的密鑰,而且把這個密鑰保存在數據庫中。
- 在頁面上顯示一個二維碼,內容是一個URI地址(otpauth://totp/帳號?secret=密鑰?issuer=廠商)
- 客戶端掃描二維碼,把密鑰『DPI45HKISEXU6HG7』保存在客戶端。
- 客戶端每30秒使用密鑰『DPI45HKISEXU6HG7』和時間戳經過TOTP『算法』生成一個6位數字的一次性密碼
兩步認證的其餘狀況
而後僅僅只是作好上面這種正常的驗證流程是不夠的,Coding 的兩步認證在一些異常狀況下作了不少處理。
- 生成的 OPT 應該是不能複用的,也就是用戶在登錄或者危險操做時輸入完一次 OPT 後,手機端 OPT 仍然未刷新時,在進行登錄或者危險操做時輸入剛纔的OPT是無效的,必須等待手機上OPT的刷新。
- 既然能夠離線使用,那麼怎麼保證時間的差別性,咱們服務端會兼容服務器時間的先後30s。從而有效的避免細微時間上差別而致使的驗證失敗,同時也避免了用戶剛輸入完 OPT 後還未作提交操做時 OPT 刷新而引發驗證失敗。
- 在遇到使用遍歷全部6位數數字進行暴力破解 OPT 時,咱們會對錯誤次數進行限制,90s 限制其錯誤次數能有效避免暴力破解的出現。
- 在開啓兩部認證後,其餘全部登錄的客戶端都會由於開啓兩部認證而過時,必須從新登錄。
兩部認證的實現
目前 Coding 採用的 https://github.com/wstrange/GoogleAuth 實現的TOTP 算法,在提供 TOTP 算法以外,該庫提供了能夠存儲用戶 secret 的接口,採用的 ServiceLoader 方式,ServiceLoader 方式能夠經過連接瞭解更多==>http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html
參考閱讀
- http://jacob.jkrall.net/totp
- http://www.insaneprogramming.be/blog/2014/05/14/two-factor-otp-security
- https://github.com/google/google-authenticator-android
- https://github.com/google/google-authenticator/tree/master/mobile/ios