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