Hmac

使用帶有短密碼和切片輸出的 HMAC-SHA256 進行短期安全散列

  • August 19, 2014

我沒有太多密碼學背景,所以如果我使用錯誤的數學術語來解釋我的需求,請原諒我。

按照這個問題,我了解到,取一個隨機秘密 16 字節password和一些隨機 16 字節msg,併計算output = HMAC_SHA256(password, msg),將需要一個知道的攻擊者outputmsg不合理的時間(超過 20 年)來恢復password,甚至找到一個不同的密碼(比如password2)會產生衝突,即相同output的密碼HMAC_SHA256(password2, msg)

如果我使用 14 字節的較短密碼(攻擊者知道這一點)會發生什麼?攻擊者需要多長時間才能找到password或碰撞password2

如果我對輸出進行切片並僅保存output[:14]怎麼辦?攻擊者需要多長時間才能找到password2這樣的碰撞: output[:14] = HMAC_SHA256(password2, salt)[:14]

比這還少呢,比如 12 字節或 10 字節?

散列機制應該在僅 1 分鐘的非常短的時間內“牢不可破”——最終目的是為帶有儲存整個列表的愚蠢客戶端的 OTP 創建一個散列鏈,並且每分鐘發送前一個“密碼”在列表(它的雜湊給出了一分鐘前發送的“密碼”)。客戶端上的記憶體是有限的(每個字節都很重要),但我不希望它進行複雜的計算,而不是從數組中查找。

根據我未受過教育的估計,縮短 2 個字節(至 14 個字節)意味著至少需要 $ \frac{20}{2^{16}} $ 年,大約是 2.7 小時。我對嗎?

謝謝

— 新估計 —

在 1 分鐘的生命週期內使用 14 字節密碼應該不是問題。如果攻擊者有一個算法可以在一分鐘內恢復 14 字節密碼,他可以開發一種算法在 65536 分鐘內恢復 16 字節密碼(蠻力擴展),大約需要 45 天(遠少於 20 年)。

即使在尋找碰撞時,切片輸出也不應該是一個問題。匹配的碰撞output[:14]比完整的多 65536 倍output,因此找到一個“更容易”65536 倍(即 $ \frac{20}{2^{16}} $ 年 $ \approx 2.7 $ 小時)。說密碼是 14 字節就相當於說它是以 16 字節密碼結尾\00\00(這就是 HMAC 無論如何對待短密碼的方式)。這只會使攻擊者更難找到碰撞,因為碰撞\00\00也必須以結束。

有人不同意嗎?

– 較新的估計 –

壞消息 - 的輸出HMAC_SHA25632個字節長,而不是 16 個!將輸出切片為 14 個字節即可 $ 2^{8 \cdot (32-14)} $ 更容易找到碰撞( $ \frac{20}{2^{144}} $ 年 $ \approx $ 根本沒有時間)。嗯……對吧?

很難估計攻擊者暴力破解密碼所需的時間。這是因為 HMAC-SHA256 在某些設備上每秒可以計算數十億次,並且存在一些設備需要毫秒來計算一個 HMAC。

順便說一句,我知道密碼實際上是一個 128 位加密密鑰,即它可以包含任何字節,對嗎?通常術語密碼用於更弱的東西。

如果您的對手擁有數千個高端 GPU 或專用 ASIC 晶片,那麼他們可以嘗試多少密碼真是令人驚訝。出於這個原因,很難估計有多強才足夠強。

T. Pornin 早些時候對暴力破解的問題做出了很好的回答:暴力破解 AES-128 的成本。儘管 AES-128 與 HMAC-SHA256(128 位密鑰)算法不同,但可以使用類似的公式來估算成本。簡短的回答:如果密碼是 16 個真正隨機的字節,即使你擁有世界上所有的錢,你也不會破解它。


HMAC-SHA256 的輸出確實是 32 字節。如果您截斷它,取決於您使用 HMAC 的方式,您可能會面臨衝突的風險。當 HMAC 用作 MAC(消息驗證碼)時,實際上幾乎習慣於截斷輸出。(HMAC-SHA256-128 即截斷為 128 位是很常見的。)如果您在一些“類似散列”的應用程序中使用它,或者如果您多次使用函式變化,那麼 128 位確實低於推薦值,因為生日效應。


順便說一句,當使用像 20 年這樣的時間估計時,您需要記住處理能力每兩年左右翻一番(摩爾定律)。出於這個原因,如果某件事需要 20 年的時間,那麼大部分處理都是在最近三年內完成的。此外,20 年可能會出現一些新的加密分析方法 SHA256 可以在時間範圍內找到(但不是完全中斷。)。

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