One-Time-Password

反向一次性密碼 - 生成秘密伺服器端

  • September 28, 2018

在我們公司,我們正在考慮一種新的身份驗證方案(不是 2FA!),其中保險庫由秘密保護。使用者應該能夠通過在網路表單中輸入一次性密碼 (OTP) 來訪問保險庫。

這是我理解正常 OTP 工作原理的理論:

  • 生成的秘密儲存在伺服器和使用者的身份驗證應用程序中
  • 某些功能現在接受時間和秘密並生成 OTP(6 位數字)
  • 伺服器驗證使用者輸入的 OTP 是否與伺服器在同一時間段生成的 OTP 匹配

`

         client                          server
         ======                          ======

        +------+                        +------+
 time -->      |                        |      <-- time
        |  fn  +--> OTP          OTP <--+  fn  |
secret -->      |                        |      <-- secret
        +------+     ^            ^     +------+
                     |            |
                     +- matches? -+

我在想這個方案是否可以像這樣轉過來:

`

         client                          server
         ======                          ======

        +------+                        +------+
 time -->      |                 time -->      |
        |  fn  +--> OTP -----+          |  fn' +--> secret
secret -->      |             +---------->      |
        +------+                        +------+

這樣,我們的伺服器應用程序將不會儲存秘密,並且我們會為使用者提供熟悉的使用者體驗來解鎖保險庫。是否可以像這樣反轉 OTP 算法?

,那行不通。原因:

  • 仍然需要與某些參考進行比較secretfn'確定它是否正確,因此伺服器中的某些內容是機密的(評論已澄清這不是應用程序中的問題)
  • 一次性密碼很短並且熵很小,秘密更長/具有更多熵,fn'因此通過資訊論論證是不可能的。
  • 客戶端和伺服器上的時間並不總是相同的。正常 OTP 也會出現該問題,並且有各種解決方法(嘗試變化time,或/和用增量計數器替換時間,這額外節省了客戶端 OTP 設備上的計時功耗)。
  • $$ Addition $$如果fn'是公開的,那麼一個 OTP 的知識和時間就足以重建secret,允許偽造其他 OTP(假設fn是公開的或 OTP 很短)。這違背了 OTP 身份驗證的基本要求。

引用自:https://crypto.stackexchange.com/questions/62717