Hash

使用假伺服器攻擊 Mobile OTP 的成本

  • March 22, 2012

你想獲得一個 74 位的秘密 $ K $ . 有一個預言機將為您提供以下幾個值的值 $ T $ :

$$ (\mathrm{MD5}(T_{\mathrm{dec}}||K_{\mathrm{hex}}))_{\mathrm{hex}}[0..5] $$

  • $ T_{\mathrm{dec}} $ 是自 1970 年以來的秒數除以 10(即以 10 秒為單位的目前時間),以十進制記數法寫出並以 ASCII 編碼為字節;
  • $ K_{\mathrm{hex}} $ 是 $ K $ 以十六進制形式寫出並以 ASCII 編碼為字節;
  • $ x_{\mathrm{hex}}[0..n-1] $ 意味著第一個 $ n $ 的十六進制數字 $ x $ .

換句話說,oracle 提供與密鑰連接的時間相關字元串的 MD5 雜湊的前 6 位數字。

實際應用是您正在模擬移動 OTP伺服器,而 oracle 是一個被欺騙嘗試向您進行身份驗證的客戶端。 $ K $ 是您嘗試獲取的客戶端密碼(設備內密碼加上使用者 PIN)。這個問題的靈感來自Mobile OTP - Secure?安全堆棧交換上。

由於來自 oracle 的每個值都提供 24 位,因此 $ 4 $ 來自 oracle 的值,你應該有足夠的資訊來暴力破解 $ K $ . (認為 $ T $ 是完全已知的,即您的時鐘與客戶端的時鐘同步,但不能影響它。)蠻力搜尋的成本是 $ 2^{74} $ MD5 計算。

是否存在已知的弱點 $ K $ 不會那麼貴?(我們正在使用具有公共前綴和公共後綴的幾個字元串的 MD5 散列。)來自 oracle 的更多值會有所幫助嗎?

如果 $ \mathrm{MD5} $ 已經在計算上與隨機預言無法區分(對於正在考慮的固定消息大小),顯然沒有比蠻力搜尋更好的方法了 $ K $ 恢復 $ K $ 或以其他方式預測函式的下一個輸出。

然而, $ \mathrm{MD5} $ 眾所周知,達不到這個目標。特別是,我們知道如何快速進行1-block 碰撞,並且理論上比 brute force 稍微好一點的原像攻擊

因此,無法保證所描述的功能是安全的,但我沒有看到任何目前結果 $ \mathrm{MD5} $ 危及它。也許有某種差異攻擊 $ (\mathrm{T}, (\mathrm{MD5}(T_{\mathrm{dec}}||K_{\mathrm{hex}}))_{\mathrm{hex}}[0..5]) $ 對,但鑑於短鍵,即使有數千對,我也不認為這是一種實際威脅 $ \mathrm{K} $ .

另一方面,該計劃有幾個真正令人擔憂的方面:

  • 沒有鹽(同樣 $ \mathrm{K} $ 和 $ \mathrm{T} $ 無論使用者或其他參數如何,都會產生相同的密碼);
  • 沒有其他嘗試減慢蠻力搜尋;
  • 74 位密鑰很短。

這三個主要錯誤相結合,使該方案非常容易受到暴力攻擊。假設 $ n $ 使用者在同一已知時間使用了他們的身份驗證設備 $ \mathrm{T} $ 一次,並且在其他三個已知時間使用過它(使用者之間不一定相同),並且已經收集了密碼,一個使用者的密鑰以超過 50% 的機率被恢復,並且在的努力 $ 0.7 \cdot 2^{74}/n $ $ \mathrm{MD5} $ 回合。這只是通過嘗試常見的鍵 $ \mathrm{T} $ 並且,在結果與使用者匹配的極少數情況下,使用該使用者的其他已知數據點進一步測試密鑰。

此外,此處未指定密鑰生成。如果密鑰不是真正隨機的,而是密碼,或者由種子不良的 RNG 生成,那將是一個進一步的弱點。更新:我們了解到 $ K $ 由隨機選擇的 64 位和 4 位數字中的 10 位組成 $ \mathrm{PIN} $ . 如果使用者選擇他們的 $ \mathrm{PIN} $ , 然後 $ 0000 $ , 其他 $ \mathrm{PIN} $ 具有 4 個相同數字和出生年份的 s 將被強烈過多地代表。這可以用來顯著加速蠻力攻擊。

與其採用這種方案,不如使用適合該工作的行業標準原語,例如 $ \mathrm{PBKDF2} $ 或更好, $ \mathrm{Scrypt} $ . 至少,使用者 ID 或某種形式的鹽應該是密碼輸入的一部分。

更新:例如,與 $ \mathrm{PBKDF2} $ 並保持 $ \mathrm{MD5} $ 作為底層原語,生成一次性密碼的函式可以替換為 $ \mathrm{PBKDF2}(\mathrm{PRF}\leftarrow\mathrm{HMAC_MD5}, \mathrm{Password}\leftarrow K||\mathrm{PIN}, \mathrm{Salt}\leftarrow\mathrm{UserID}, \mathrm{Count}\leftarrow 512, dkLen\leftarrow 3 \mathrm{bytes}) $

理由:使用 $ \mathrm{Salt} $ (例如使用者 ID)確保暴力攻擊不能針對多個使用者,避免 $ /n $ 以上因素。這 $ \mathrm{Count} $ 參數是增加有效密鑰長度(加倍 $ \mathrm{Count} $ 對蠻力攻擊的影響與成長相同 $ K $ 一位),以及身份驗證的計算成本(隨 $ \mathrm{Count} $ 在設備和伺服器端)。使用給定的參數,假設在相同的 10 秒內有 1000 個使用者,該方案的破解難度大約是原始方案的一百萬倍。使用 $ \mathrm{HMAC} $ 增加對理論攻擊的保證,即使 $ \mathrm{MD5} $ 不夠完美。

鑑於 64 位密碼和 10 位 PIN 是真正隨機的,我們正在談論暴力破解 2^74 個 MD5(我們將不得不多次這樣做,因為每次攔截的 6 位密碼都會有數十億次沖突)。給定一個每秒可以執行 2 億次 MD5 的快速硬體,每次密碼和每一輪都需要 300 萬年才能找到衝突。我們需要多少輪?我們有足夠的時間嗎?

說明一點:選擇一個好的 PIN。如果您過於三心二意,請選擇 128 位密鑰。無論如何,Mobile-OTP 將是您整體安全設計中最強大的元素之一。

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