Timing-angreb i kode på applikationsniveau
Lær, hvordan timinglækager i strengsammenligninger afslører hemmeligheder, og hvordan constant-time-sammenligning forhindrer dem.
Timing-angreb i kode på applikationsniveau er en gratis Cryptology Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Cryptology Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Cryptology Academy-kurset indeholder 4 lektioner i alt.
Strengsammenligning, der ikke tager konstant tid
Den almindelige operator til strenglighed i de fleste programmeringssprog afslutter, så snart der findes en uoverensstemmelse. Python's == på bytes-objekter, C's strcmp og Java's String.equals returnerer alle straks, når den første forskellige byte findes. Ved normal strengsammenligning er dette en optimering, men ved sammenligning af hemmelige værdier som MAC-tags eller adgangskoder skaber det en målbar tidsbaseret sidekanal, der lækker oplysninger.
Måling af tid ved sammenligning af HMAC
En angriber måler den tid, det tager at sammenligne et indsendt HMAC-tag med den korrekte værdi. Det tager en smule længere tid at indsende et HMAC, hvor den første byte stemmer, end et hvor den første byte er forkert (én ekstra bytesammenligning). Ved at indsende mange værdier med hver mulig første byte og måle svartiderne kan angriberen identificere den korrekte første byte. Processen gentages byte for byte, indtil hele tagget er gendannet.
Praktisk præcision ved timingangreb
Moderne timingangreb over netværk kan skelne mellem tidsforskelle på ti til flere hundrede nanosekunder via internettet. En 32-byte HMAC-sammenligning, hvor hver korrekt byte tilføjer cirka 10-100 ns behandlingstid, giver et målbart signal, hvis der foretages tilstrækkeligt mange gentagne målinger til at udjævne netværksjitter. På et lokalt netværk kan selv forskelle på én nanosekund udnyttes med tilstrækkeligt mange statistiske målinger.
Sårbarhed ved Pythons ==-operator
I Python er det usikkert at sammenligne MAC-tags med ==: if mac == submitted_mac returnerer True eller False afhængigt af placeringen af det første mismatch. En angriber, der indsender tusindvis af manipulerede tags og måler svartiderne, kan gendanne det forventede tag byte for byte. Denne sårbarhed har optrådt i webapplikationer i produktion, hvor sammenligning af sessionstokens eller API-nøgler fejlagtigt blev implementeret uden funktioner med konstant køretid.
hmac.compare_digest i Python
Pythons hmac.compare_digest(a, b) sammenligner to byte- eller strengværdier med konstant køretid, så det tager lige lang tid, uanset hvor det første mismatch forekommer. Funktionen er implementeret i C for at sikre konstant køretid, selv når fortolkning af Pythons bytekode medfører ekstra omkostninger. Brug altid hmac.compare_digest til at sammenligne MAC-tags, sessionstokens, API-nøgler eller andre værdier, hvor timingoplysninger kan være farlige.
CRYPTO_memcmp i OpenSSL
OpenSSL leverer CRYPTO_memcmp(a, b, length) til hukommelsessammenligning med konstant køretid. I modsætning til memcmp behandler den altid alle length-byte, uanset om der opstår et tidligt mismatch. Returværdien er nul, hvis værdierne er ens, og ikke-nul, hvis de er forskellige. Det er vigtigt altid at sammenligne den fulde forventede længde: Hvis værdier med forskellig længde sammenlignes ud fra den korteste længde, kan der stadig lækkes oplysninger om længden. Brug CRYPTO_memcmp i alle sikkerhedskritiske sammenligninger i C/C++-kode, der bruger OpenSSL.
Timingangreb på RSA: Bleichenbacher
Timingangreb rækker længere end strengsammenligning. Bleichenbachers angreb fra 2006 på RSA PKCS#1 v1.5-dekryptering viste et praktisk timingorakel mod SSL/TLS-implementeringer. Tiden for RSA-operationen med den private nøgle varierede afhængigt af, om den dekrypterede værdi havde gyldig PKCS#1-padding. Ved at indsende tusindvis af manipulerede chiffertekster kunne angribere gendanne private RSA-nøgler. Det førte til RSA-OAEP og RSA-implementeringer med konstant køretid.
Cache-timingangreb på AES
AES-implementeringer, der bruger opslagstabeller (almindeligt af hensyn til ydeevnen), tilgår forskellige tabelposter afhængigt af nøglen og klarteksten. Cache-træf og cache-fejl skaber målbare tidsforskelle, som lækker oplysninger om, hvilke tabelposter der blev tilgået. Denne sidekanal kan afsløre AES-nøgler. Forsvaret er at bruge AES-implementeringer, der ikke er afhængige af opslag i tabeller, f.eks. AES-NI-hardwareinstruktioner eller bitopdelte softwareimplementeringer.
Principper for implementering med konstant køretid
Skrivning af kode med konstant køretid kræver, at du undgår betingede forgreninger baseret på hemmelige data (brug forgreningsfri udvælgelse med maskering), hukommelsesadgangsmønstre, der afhænger af hemmelige data (undgå opslagstabeller indekseret med hemmeligheder), samt operationer, hvis latenstid afhænger af hemmelige værdier (f.eks. division på visse processorer). Kompilatorer kan optimere konstruktioner med konstant køretid væk, så assemblerkode eller volatile-hukommelsesadgange kan være nødvendige i kritiske sektioner.
AEAD eliminerer sammenligning af MAC-tags på applikationsniveau
Det bedste forsvar mod timingangreb på MAC-sammenligning er at bruge AEAD-tilstande (GCM, ChaCha20-Poly1305) og overlade MAC-verificeringen til det kryptografiske bibliotek. Biblioteksimplementeringer udfører selv verificering med konstant køretid. Hvis du bruger AEAD korrekt (dekrypteringen mislykkes ved enhver manipulation, og du dekrypterer aldrig før tagget er verificeret), behøver du aldrig sammenligne MAC-tags i applikationskode, hvilket helt fjerner timing-sårbarheden.
Test for timing-sårbarheder
Test af timing-sårbarheder kræver statistisk analyse af fordelinger af svartider. Værktøjer som tlsfuzzer, testscripts til timingangreb og dudect-frameworket hjælper med at opdage tidsforskelle i kryptografiske implementeringer. En t-test af stikprøver af svartider for input, der burde give samme timing, kan afsløre statistisk signifikante forskelle. Falske negative resultater er mulige; en kodegennemgang med fokus på konstant køretid er også vigtig sammen med test.
Sammenligning med konstant køretid
Hvilken Python-funktion skal bruges til sikkert at sammenligne et HMAC-tag for at forhindre timingangreb?
Opsummering af timingangreb
Opsummering af timingangreb: Strengsammenligning med tidlig afslutning lækker hemmelige værdier byte for byte via forskelle i svartider; det kan måles over et netværk med tilstrækkeligt mange målinger; brug hmac.compare_digest i Python og CRYPTO_memcmp i OpenSSL til sammenligning med konstant køretid; timingangreb på RSA-padding kan kompromittere private nøgler (brug RSA med konstant køretid og OAEP); timingangreb på opslagstabeller i AES lækker nøglebits (brug AES-NI eller bitopdelte implementeringer); og bibliotekernes AEAD-verificering eliminerer behovet for sammenligning af MAC-tags på applikationsniveau.
Lær Cryptology Academy med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 67
- Lektioner
- 261
Ofte stillede spørgsmål
Er lektionen “Timing-angreb i kode på applikationsniveau” gratis?
Ja — hele teksten til “Timing-angreb i kode på applikationsniveau” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Cryptology Academy-kurset, skal du opgradere til CoddyKit PRO. Cryptology Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Timing-angreb i kode på applikationsniveau”?
Lær, hvordan timinglækager i strengsammenligninger afslører hemmeligheder, og hvordan constant-time-sammenligning forhindrer dem. Du øver dig i Cryptology Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Cryptology Academy?
Der kræves ingen tidligere erfaring. Cryptology Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Timing-angreb i kode på applikationsniveau”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Cryptology Academy-lektion?
Ja. Alle Cryptology Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Padding oracle-angreb i detaljer
- Replay-angreb og sårbarheder ved genbrug af nonces
- Timing-angreb i kode på applikationsniveau
- De vigtigste mønstre for forkert brug af kryptografi