如果您知道之前的值是多少,是否可以預測 MFA 程式碼?
我在手機上使用了一個應用程序,在掃描網站上的二維碼後,它會為我提供每 30 秒更改一次的 6 位數程式碼。這些程式碼可用於某些網站上的多重身份驗證 (MFA),通常代替 SMS 程式碼或應用內登錄確認。
大概這些程式碼是基於只有我和網站提供商都知道的共享秘密生成的——我在設置 MFA 時最初掃描的 QR 碼。據我了解,這個想法是,如果沒有該原始程式碼,您將無法計算在任何給定的 30 秒時間段內有效的 6 位 MFA 程式碼。
不過,我很好奇。如果攻擊者獲得了對我使用的設備的鍵盤記錄器訪問權限並且能夠定期擷取這些 6 位程式碼的值怎麼辦?隨著時間的推移,攻擊者是否有可能使用這段程式碼歷史以及它們的使用時間來獲得我最初設置 MFA 時給出的原始 QR 碼?
本質上,我是否需要偶爾輪換我的 MFA 帳戶?
$$ Is $$隨著時間的推移,攻擊者是否有可能使用這些程式碼歷史以及它們的使用時間來獲取我最初設置 MFA 時獲得的原始 QR 碼?
要回答這個問題,需要了解TOTP(相關標準的工作原理)。也就是說,它本質上是從註冊中獲取目前時間1和預共享密鑰並將它們輸入HMAC(通常是 HMAC-SHA1,但也支持其他雜湊算法),然後獲取返回的字節字元串,將其轉換為整數,本質上減少它 $ \bmod 10^6+1 $ (或您配置的任何數字)。
現在請注意,攻擊者最弱的目標是預測您是在每個時間間隔隨機生成這些數字還是使用 TOTP(例如,恢復秘密可以讓您這樣做)。這在密碼學術語中稱為 PRF 安全性,幸運的是已經針對 HMAC 進行了深入研究。在本文中可以找到目前最知名的安全估計。它指出,人們只能用機率將 HMAC 與隨機函式(定理 1)區分開來 $ \varepsilon’=(2q+1)\varepsilon+q^2/2^c $ 做的時候 $ q $ 查詢(即看到 $ q $ 不同的輸出)為 $ c $ 位輸出。這 $ \varepsilon $ 這是散列函式使用的底層壓縮函式的安全性,通常假設它也滿足 PRF 安全性。啟發式地可以假設 $ \varepsilon=q/2^c $ 一個好的散列函式——直到今天還包括 SHA1 和 MD5。把東西塞在一起,我們得到 $ \varepsilon’\approx q^2/2^c $ 和 $ c $ 對於 SHA-1 為 512,這個值在人類一生中可以忽略不計。現在這意味著中間 TOTP 輸出與不同輸出的隨機字元串無法區分,這反過來意味著程式碼與隨機程式碼無法區分。這就是我們想要展示的。
所以你可能想知道以上所有這些到底意味著什麼:
- 當攻擊者不知道共享秘密(即使知道輸入時間)時,將 MFA 程式碼與隨機選擇的程式碼區分開來基本上是不可能的。
- 由於之前的對手只看到程式碼(並知道生成它們的時間)無法預測任何未來或過去的看不見的程式碼。
- 由於之前的對手只看到程式碼(並知道生成它們的時間)無法預測通過 QR 碼獲得的共享秘密。
本質上,我是否需要偶爾輪換我的 MFA 帳戶?
如上所述,不,你沒有。
1:實際上它需要目前時間減去unix epoch除以基本間隔持續時間,例如30s。