A kriptográfiában és a számítógépes biztonságban az üzenethosszabbító támadás egy olyan hash-függvény elleni támadás , amely új információkat ad az eredeti üzenet végéhez. Ebben az esetben akkor is számítható új hash érték, ha az eredeti üzenet tartalma ismeretlen marad. Ha hash függvényt használ hamis beszúrásként , az új érték lesz az új üzenet érvényes hitelesítési kódja .
Támadás hajtható végre H (K || m) konstrukciójú hashekre, ahol K egy bizonyos titkos kulcs , m egy üzenet és || összefűzést jelenti . [1] Így a Merkle-Damgard struktúrán alapuló SHA-1 és MD5 hash függvények sebezhetőek az ilyen típusú támadásokkal szemben. [1] [2] [3] Másrészt a HMAC nem érzékeny az üzenethosszabbító támadásokra, mert nem használja a leírt H (K || m) konstrukciót. [4] Az SHA-3 algoritmus szintén nem sebezhető ezzel a támadással szemben. [5]
Az ilyen típusú támadásokkal szemben sebezhető kivonatoló függvények algoritmusa az értékük iteratív kiszámítása. A bemeneti üzenet részekre oszlik, és a függvény minden részt felváltva dolgoz fel. Az üzenet egyes blokkjaival végzett munka eredményeként a hash függvény átalakítja a belső állapotát, amely a következő rész feldolgozására szolgál. Az első üzenetblokkhoz egy előre meghatározott inicializálási érték kerül alkalmazásra .
Az üzenet minden részének feldolgozása után létrejön a hash kimenet, amely az üzenet utolsó blokkjának feldolgozása utáni belső állapotának reprezentációja. Ezért a függvény értékéből visszaállíthatja a belső állapotát, amely aztán felhasználható új adatok feldolgozására. Most meghosszabbíthatja az eredeti üzenetet úgy, hogy új információkat ad hozzá a végéhez, és kiszámíthatja az új üzenetre érvényes hash értéket.
Így a megfelelő hash függvények alábbi működési elveit különböztethetjük meg [6]Vagyis az üzenet valójában kivonatolt
m' = m || párnázás,
ahol m az eredeti üzenet, a kitöltés pedig az, amivel a hash függvény kitöltötte az utolsó blokkot.
A támadás végrehajtásához ki kell hasítani az üzenetet
m' = m || Bélés || új adatok || Új Padding ,
vagyis új információt tulajdonítani az eredeti üzenetnek.
Így egy üzenet meghosszabbításához meg kell találni az eredeti üzenet hosszát, majd meg kell határozni a Padding értékét. Meg kell határozni a kitöltési formátumot , különben a függvény eltérő eredményeket adna ugyanarra a bemenetre. [6]
Egy adott waffle-típusú waffle-kézbesítési szolgáltatás egy adott user_id felhasználóhoz az alábbi formátumú kérések feldolgozására valósul meg :
Eredeti üzenet: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo Eredeti aláírás: 6d5f807e23db210bc254a28be2d6759a0f5f5d99A szerver csak akkor teljesíti ezt a kérést (az 1. felhasználói azonosítóhoz tartozó "Eggo"-hoz hasonló ostyákat ) csak akkor, ha az aláírás érvényes az adott felhasználó számára. Az aláírás egy üzenet-hitelesítési kód, amelyet a támadó számára ismeretlen kulccsal írnak alá . Ez a példa is sebezhető az újrajátszható támadásokkal szemben , amikor ugyanazt a kérést és aláírást másodszor is elküldik.
A támadó módosíthatja a kérést, ebben a példában a kívánt gofri típust "Eggo"-ról "Liege"-re módosítva. Ez megtehető az üzenetformátum rugalmasságával: ha több megbízás van egy sorban, akkor az utolsót részesítjük előnyben. A kriptográfiai biztonság biztosítása ebben a példában teljes mértékben az aláíráson múlik.
Kívánt üzenet: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo&waffle=liegeEgy új kérelem aláírásához a támadónak ismernie kell az eredeti üzenet aláírásához használt kulcsot. Itt azonban használhat kiterjesztő támadást.
Miután kitalálta az üzenet hosszát , a támadó új kérést generál:
Új üzenet: 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\x02\x28&waffle=liegeEz az üzenet tartalmazza az eredeti adatokat és a hozzá adott részt, amelyet a hash függvény korábban generált a munkája során ( Padding ). A példában ez a rész hexadecimálisan van ábrázolva . Ebben az esetben a függvény eggyel, majd nullákkal kiegészíti az üzenetet, és a végére hozzáadja az üzenet hosszát. A támadó tudja, hogy az eredeti üzenet hash-függvényének állapota megegyezik az új üzenet állapotával egészen az utolsó „&”-ig. A hash függvény belső állapotát ezen a ponton az eredeti üzenetből származó hash értéke, azaz az aláírás határozza meg.
A megfelelő állapotban lévő hash algoritmus ezután feldolgozza az új üzenet fennmaradó részét, és új érvényes aláírást hoz létre.
Új aláírás: 0e41270260895979317fff3898ab85668953aaa2Így a támadó érvényes aláírást szerzett a titkos kulcs ismerete nélkül.
Új kérés érkezésekor a szerver érvényesnek tekinti azt, mivel az aláírás megegyezik azzal, amely akkor jönne létre, ha a titok ismert lenne.