奇怪的MAC算法
我正在與使用以下算法簽署消息的支付提供商合作:
k
商家安全地獲得了一個只有他們和支付提供商知道 的密鑰。**編輯:**通常鑰匙很長。- 支付是通過重定向實現的,商家稍後會收到回調,其中包含有關支付操作成功或失敗的資訊。商家認為此資訊值得信賴。這是訂單號成功支付回調的範例。1234 和一個商家託管在
example.com
:
example.com?orderID=1234&paymentStatus=SUCCESS&...&signature=abcd
3. 簽名的消息m
按以下方式形成:
orderid=<..>|paymentStatus=<..>|...
4. 簽名算法S(m,k)
被選擇為:(signature=H(m||k)
意味著m||k
與m
密鑰連接k
) 其中H
是一個散列函式,在這種情況下MD5
。 5. 驗證算法是V(signature, m, k)
並且僅在 時返回 trueH(m||k) = signature
。據我了解,如果簽名算法是 MD5 的內部工作原理,
S(m,k) = H(k||m)
那麼這將是完全不安全的,因為如果攻擊者知道H(k||m)
她可能能夠計算出她選擇的消息H(k||m||m')
在哪裡m'
- 這意味著簽名容易受到兩者的攻擊存在的和選擇性的偽造。正確的?但無論有意與否,算法是S(m,k) = H(m||k)
- 密鑰放在連接字元串的最後。到目前為止,我想不出這個協議中有可利用的漏洞(我沒有考慮 MD5 固有的問題)。任何想法,這是否足夠安全?
我們可以
MAC(k,m)=MD5(m||k)
在選擇的消息設置中攻擊由: 定義的 MAC,主要是因為 MD5 的抗碰撞性被破壞。對手選擇相同長度
m
的m'
$ b\ge64 $ 字節,僅在它們的第一個不同 $ \lfloor b/64\rfloor $ 64 字節的塊,這樣在對m
和的這些塊進行散列後會發生衝突m'
。If 遵循那個MAC(k,m)=MAC(k,m')
,也MAC(k,m||m")=MAC(k,m'||m")
為 anym"
。我們知道各種有效的技術來創建這樣的m
andm'
, with $ b $ 低至 128 甚至 64 字節,包括適度的約束:
- Xiaoyun Wang,Dengguo Feng,Xuejia Lai,Hongbo Yu:雜湊函式MD4 、MD5、HAVAL-128和RIPEMD的衝突
- Xiaoyun Wang, Hongbo Yu:如何破解 MD5 和其他雜湊函式(在 Eurocrypt 2005 會議記錄中)
- Vlastimil Klima:雜湊函式中的隧道:一分鐘內的 MD5 衝突(在 Cryptology ePrint 存檔中,2006 年)
- Marc Stevens:對 MD5 的單塊碰撞攻擊(在 Cryptology ePrint Archive,2012中,此處提供程式碼和範例)
- Tao Xie, Fanbao Liu and Dengguo Feng: Fast Collision Attack on MD5 ( in Cryptology ePrint Archive, 2013 )
如果我們有一個完整的Merkle-Damgård雜湊而不是 MD5,比如 SHA-256,或者隨機預言模型中的安全雜湊(SHA-256 不完全,因為它具有長度擴展屬性),那麼我們基本上會如本問題所述,沒有已知的攻擊。