Inom kryptografi och datorsäkerhet är en meddelandeförlängande attack en typ av attack på en hashfunktion som lägger till ny information i slutet av det ursprungliga meddelandet. I det här fallet kan ett nytt hashvärde beräknas även om innehållet i det ursprungliga meddelandet förblir okänt. När du använder en hash-funktion som en skeninlägg kommer det nya värdet att vara den giltiga autentiseringskoden för det nya meddelandet.
En attack kan utföras på hash med konstruktionen H (K || m), där K är en viss hemlig nyckel , m är ett meddelande och || betyder sammanlänkning . [1] Således är hashfunktionerna SHA-1 och MD5 baserade på Merkle-Damgard-strukturen sårbara för denna typ av attack. [1] [2] [3] Å andra sidan är HMAC inte mottaglig för en meddelandeförlängningsattack eftersom den inte använder den beskrivna H (K || m)-konstruktionen. [4] SHA-3- algoritmen är inte heller sårbar för denna attack. [5]
Algoritmen för att hasha funktioner som är sårbara för denna typ av attack är att iterativt beräkna deras värde. Inmatningsmeddelandet är uppdelat i delar och funktionen bearbetar varje del i tur och ordning. Som ett resultat av att arbeta med varje block i meddelandet omvandlar hashfunktionen sitt interna tillstånd, vilket används för att bearbeta nästa del. För det första meddelandeblocket tillämpas ett fördefinierat initialiseringsvärde .
Efter att alla delar av meddelandet har bearbetats genereras hash-utgången, som är en representation av dess interna tillstånd efter bearbetning av det sista blocket i meddelandet. Därför kan du från värdet av funktionen återställa dess interna tillstånd, som sedan kan användas för att bearbeta nya data. Nu kan du förlänga det ursprungliga meddelandet genom att lägga till ny information i slutet och beräkna ett hashvärde som kommer att vara giltigt för det nya meddelandet.
Sålunda kan vi särskilja följande funktionsprinciper för motsvarande hashfunktioner [6]Det vill säga att meddelandet faktiskt hashas
m' = m || stoppning,
där m är det ursprungliga meddelandet, är Padding vad hashfunktionen fyllde det sista blocket med.
För att utföra en attack är det nödvändigt att hasha meddelandet
m' = m || Vaddering || nya data || NewPadding ,
det vill säga att tillskriva ny information till det ursprungliga meddelandet.
För att förlänga ett meddelande måste man alltså gissa längden på det ursprungliga meddelandet och sedan bestämma värdet på Padding. Fyllningsformatet måste definieras , annars skulle funktionen ge olika resultat för samma indata. [6]
Våffelleveranstjänsten av en given våffeltyp till ett specifikt användar -ID implementeras för att behandla förfrågningar av detta format :
Ursprungligt meddelande: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo Originalsignatur: 6d5f807e23db210bc254a28be2d6759a0f5f5d99Servern kommer att uppfylla denna begäran (leverera wafers som "Eggo" för användar -id 1) endast om signaturen är giltig för den användaren. Signaturen är en meddelandeautentiseringskod, den är signerad med en nyckel som är okänd för angriparen . Det här exemplet är också sårbart för omspelsattacker när samma begäran och signatur skickas en andra gång.
En angripare kan modifiera begäran, i det här exemplet, genom att ändra önskad våffeltyp från "Eggo" till "Liege". Detta kan göras genom att använda meddelandeformatets flexibilitet: om det finns flera order på en rad är den sista att föredra. Att säkerställa kryptografisk säkerhet i detta exempel ligger helt och hållet på signaturen.
Önskat meddelande: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo&waffle=liegeFör att signera en ny begäran måste angriparen känna till nyckeln som användes för att signera det ursprungliga meddelandet. Däremot kan han här använda en förlängningsattack.
Efter att ha gissat längden på meddelandet genererar angriparen en ny begäran:
Nytt meddelande: 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=liegeDetta meddelande inkluderar originaldata och den del som lagts till, som hashfunktionen tidigare genererade under sitt arbete ( Padding ). I exemplet är denna del representerad i hexadecimal . I det här fallet fyller funktionen meddelandet med en, följt av nollor, och längden på meddelandet läggs till i slutet. Angriparen vet att tillståndet för hashfunktionen för det ursprungliga meddelandet är identiskt med dess tillstånd för det nya meddelandet upp till sista "&". Det interna tillståndet för hashfunktionen vid denna punkt bestäms av hashvärdet från det ursprungliga meddelandet, d.v.s. signaturen.
Hashalgoritmen i rätt tillstånd kommer sedan att bearbeta resten av det nya meddelandet och skapa en ny giltig signatur.
Ny signatur: 0e41270260895979317fff3898ab85668953aaa2Således fick angriparen en giltig signatur utan att känna till den hemliga nyckeln.
Vid mottagande av en ny begäran kommer servern att betrakta den som giltig, eftersom signaturen är identisk med den som skulle genereras om hemligheten var känd.