版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-長(zhǎng)度擴(kuò)展攻擊

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶(hù)提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

在密碼學(xué)和計(jì)算機(jī)安全中,**長(zhǎng)度擴(kuò)展攻擊(Length extension attacks)**是指針對(duì)某些允許包含額外信息的加密散列函數(shù)的攻擊手段。

解釋在密碼學(xué)和計(jì)算機(jī)安全中,**長(zhǎng)度擴(kuò)展攻擊(Length extension attacks)**是指針對(duì)某些允許包含額外信息的加密散列函數(shù)的攻擊手段。

該攻擊適用于在消息與密鑰的長(zhǎng)度已知的情形下,所有采取了H(密鑰∥消息) 此類(lèi)構(gòu)造的散列函數(shù)。MD5和SHA-1等基于Merkle–Damg?rd構(gòu)造的算法均對(duì)此類(lèi)攻擊顯示出脆弱性。注意,由于密鑰散列消息認(rèn)證碼(HMAC)并未采取H(密鑰∥消息)的構(gòu)造方式,因此不會(huì)受到此類(lèi)攻擊的影響(如HMAC-MD5、HMAC-SHA1)。SHA-3算法對(duì)此攻擊免疫。1

對(duì)此類(lèi)攻擊脆弱的散列函數(shù)的常規(guī)工作方式是:獲取輸入消息,利用其轉(zhuǎn)換函數(shù)的內(nèi)部狀態(tài);當(dāng)所有輸入均處理完畢后,由函數(shù)內(nèi)部狀態(tài)生成用于輸出的散列摘要。因而存在著從散列摘要重新構(gòu)建內(nèi)部狀態(tài)、并進(jìn)一步用于處理新數(shù)據(jù)(攻擊者偽造數(shù)據(jù))的可能性。如是,攻擊者得以擴(kuò)充消息的長(zhǎng)度,并為新的偽造消息計(jì)算出合法的散列摘要。

示例一個(gè)用于向指定地點(diǎn)的用戶(hù)遞送指定種類(lèi)華夫餅(一種源于比利時(shí)的烤餅)的服務(wù)器,可處理如下格式的請(qǐng)求:2

原始數(shù)據(jù): count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo原始簽名: 6d5f807e23db210bc254a28be2d6759a0f5f5d99

當(dāng)且僅當(dāng)該用戶(hù)給出的簽名對(duì)于其當(dāng)前請(qǐng)求(向指定地點(diǎn)的用戶(hù)1遞送10個(gè)Eggo華夫餅)而言合法時(shí),服務(wù)器才會(huì)實(shí)際處理該業(yè)務(wù)。該簽名是一個(gè)消息認(rèn)證碼(MAC),由某個(gè)攻擊者不可知曉的密鑰簽發(fā)。(事實(shí)上,這個(gè)例子對(duì)于重放攻擊同樣脆弱,攻擊者亦可能通過(guò)二次發(fā)送同樣的請(qǐng)求和簽名來(lái)實(shí)施攻擊。)

攻擊者可能篡改該請(qǐng)求,在上述例子中,假設(shè)某攻擊者把華夫餅的種類(lèi)從“eggo”改為“l(fā)iege”,這可以借助于消息格式本身的靈活性達(dá)到:對(duì)于請(qǐng)求字符串中重復(fù)的參數(shù)域,總是處理最后的參數(shù)。這樣的靈活性并不能算作是消息格式本身的安全漏洞,因?yàn)橄⒏袷皆谠O(shè)計(jì)之初并未以安全性為前提;安全性需要通過(guò)簽名算法的輔助來(lái)達(dá)到。

攻擊者希望篡改的新數(shù)據(jù): count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo&waffle=liege

為了給此新信息加上合法的簽名,攻擊者通常需要知道用于簽名信息的密鑰,并由此密鑰生成一個(gè)新的MAC來(lái)作為新簽名。然而,借助于長(zhǎng)度擴(kuò)展攻擊手段,攻擊者可以將散列(如上給出的簽名)傳遞給散列函數(shù)作為原始狀態(tài),而從原請(qǐng)求處開(kāi)始繼續(xù)處理,這只需知道原請(qǐng)求的長(zhǎng)度即可;在該請(qǐng)求中,原密鑰的長(zhǎng)度為14字節(jié),這可以通過(guò)試探不同長(zhǎng)度的偽造請(qǐng)求、并檢查何種長(zhǎng)度的請(qǐng)求被服務(wù)器接受而得到。

傳遞給散列函數(shù)的信息通常是填充(Padding)后的,因?yàn)樵S多算法只接受長(zhǎng)度為指定大小倍數(shù)的輸入。填充的內(nèi)容是由采用的散列函數(shù)決定的。攻擊者在新信息中除了包含原信息和偽造信息之外,還應(yīng)當(dāng)包含必需的填充位。因而,攻擊者利用填充規(guī)則可以構(gòu)造出如下信息:

新數(shù)據(jù): count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo\x80\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x02&waffle=liege

該信息包含了散列函數(shù)中添加到原消息的填充位(在此示例中,是一個(gè)0x80,隨后是若干0x00,最后是消息長(zhǎng)度)。攻擊者知道原消息的散列密鑰/消息對(duì)所對(duì)應(yīng)的狀態(tài)直到最后一個(gè)“&”為止,均和新消息是相同的;攻擊者此時(shí)亦知道其散列摘要,這意味著散列函數(shù)的內(nèi)部狀態(tài)已經(jīng)被完全偽造。此時(shí),初始化一個(gè)散列算法就非常簡(jiǎn)單了,給定剩余的字符串作為輸入,即可生成一個(gè)用于簽名的新摘要,而根本無(wú)須知曉原密鑰。

新簽名: 0e41270260895979317fff3898ab85668953aaa2

通過(guò)連接新簽名和新數(shù)據(jù)成為一個(gè)新請(qǐng)求,服務(wù)器將把該偽造的請(qǐng)求視作一個(gè)有效的請(qǐng)求,因?yàn)槠浜灻驮谥烂艽a情況下生成的簽名完全等效。

該攻擊主要用于偽造已簽名的消息,但亦可能存在其他用途。

實(shí)現(xiàn)目前實(shí)現(xiàn)該類(lèi)型攻擊的工具并不多。一個(gè)借助于OpenSSL實(shí)現(xiàn)了針對(duì)多種散列函數(shù)的攻擊的工具是 HASHPUMP。該工具支持針對(duì)MD5、SHA1、SHA256和SHA512的長(zhǎng)度擴(kuò)展攻擊。SHA224和SHA384受此攻擊的影響相對(duì)較小,由于這兩個(gè)函數(shù)的輸出分別是更長(zhǎng)的散列函數(shù)(分別是256及512位)的前224位和前384位,因此其輸出并不包含散列內(nèi)部狀態(tài)的全部長(zhǎng)度,不能直接使用散列值進(jìn)行長(zhǎng)度擴(kuò)展攻擊。然而,SHA224和SHA384畢竟輸出了更長(zhǎng)散列的很大一部分,因此攻擊者仍然可以輕易地首先窮舉得到剩下的部分(缺失長(zhǎng)度僅為32位和128位)后,再實(shí)施長(zhǎng)度擴(kuò)展攻擊。因此,不能依賴(lài)截取部分散列來(lái)實(shí)現(xiàn)消息驗(yàn)證碼。

本詞條內(nèi)容貢獻(xiàn)者為:

王沛 - 副教授、副研究員 - 中國(guó)科學(xué)院工程熱物理研究所