2013-11-28 26 views
1

那麼作爲項目的一部分,我想實現一個兩步認證系統(在軌)兩步認證,它是如何工作的?

我理解它的原理,

=>客戶端:用戶名和密碼

< =服務器:生成的PIN碼,並通過短信發送到客戶端/電子郵件

=>客戶端:輸入PIN

< =服務器:驗證客戶端正常

現在我想知道的是在基於Web的應用程序中,例如rails,PIN需要在每個點都保密,所以當從用戶名/密碼部分重定向到PIN部分時,我需要保留PIN碼祕密,同時將它傳遞到系統的下一部分(PIN部分)

是否唯一體面的方法是通過將PIN碼暫時存儲在數據庫中以及用戶ID?

回答

2

不,不是那樣。

有(在您的術語動態口令,PIN碼)兩(最常用的)類型的一次性密碼:

  1. 基於時間的
  2. 基於計數器

基於時間的(TOTP)根據當前時間生成一些數字(例如:從1970.1.1 00:00開始的30秒間隔數)和一些共享密鑰。當收到這樣的一次性密碼時,服務器會產生一個密碼,並檢查它是否正確。

在基於計數器的OTP中,計數器和密鑰存儲在數據庫中靠近用戶ID的位置,並用於生成OTP。它可以基於登錄嘗試而增加。

基於時間的令牌通常更好,因爲它們不需要計數器同步(時間同步通常更容易)。最好的例子是Google Authenticator,它實現了RFC6238的標準TOTP。

還有一個號稱與谷歌Authenicator兼容性紅寶石OTP庫,你可能想嘗試一下:link

不能保證其安全性和/或質量,但它看起來很有希望。

+0

我添加HOTP(基於計數器的OTP)規範:http://tools.ietf.org/html/rfc4226 – Jcs

+0

如果服務器時間和客戶端時間不同步,那意味着當時我該怎麼辦?例如:客戶設置他/她的時間5分鐘快/慢 –

+0

那麼,在我看來,這是客戶的問題,然後;但谷歌有其他意見,並在TOTP應用程序中實現單獨的時間同步(參考[Google Authenticator](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2)應用程序) – DarkWanderer