Hvad er kodeforblændelse? Sådan forklæder du din kode for at gøre den mere sikker

I de tidligste dage med computing behøvede udviklere ikke at bekymre sig om netværk. De kunne bare fokusere på at sikre, at deres software tjente det tilsigtede formål og ikke kolliderede for ofte.

Og den gennemsnitlige person, der kom i kontakt med denne software, var ikke en trussel. De fleste brugere gider ikke engang læse de brugsanvisninger, der sendes i softwarekassen, endsige skure koden for sårbarheder.

Derefter kom Internettet og ændrede alt.

Næsten natten over blev computernetværk forbundet. Og da kompleksiteten voksede, steg også oddsene for, at nogen ville finde vej ind i de netværk, der ikke hørte hjemme der.

Og oftere end ikke ville disse mennesker have de nødvendige færdigheder til at udnytte mangelfuld kode.

Og det bringer os til i dag. Det er en tid med hidtil uset cybersikkerhedstrusler. Og nyheder om cyberangreb ser ud til at komme dagligt.

Som svar implementerer netværkschefer mere og mere sofistikerede defensive systemer for at hærde deres netværk mod ubudne gæster. Og de forventer nu, at softwareudviklere går en ekstra mil for at sikre deres kode for at forhindre uautoriseret adgang.

Og alligevel læres hærdning af computerkode stadig ikke meget i kodeskoler. Men det bliver et must i moderne applikationsudvikling.

For at hjælpe med at afhjælpe det forklarer jeg i denne artikel, hvad kodefølgelse er. Og jeg vil også give dig et overblik over de seks mest afgørende kodeforblændelsesteknikker, der bruges i dag for at komme i gang på vejen til at skrive mere sikker software.

Hvad er kodeforblænding?

Som navnet antyder, henviser kode-tilsløring til en række programmeringsteknikker designet til at skjule elementer i et programs kode. Det er den primære måde, hvorpå programmører kan forsvare deres arbejde mod uautoriseret adgang eller ændring fra hackere eller immaterielle tyve.

Og vigtigst af alt kan kodefølgningsteknikker ændre strukturen og metoderne, som et program bruger til at betjene, men de ændrer aldrig programmets output.

Problemet er, at mange kodeforblændelsesteknikker kan føje til et programs overhead og øge udførelsestiden.

Af den grund er det afgørende at forstå, hvilke teknikker der er relativt straffefri, og hvilke der kan forårsage præstationsproblemer. Når du først kender omkostningerne, er det muligt at afbalancere beskyttelse og ydeevne i en applikation i den virkelige verden.

Her er de seks mest anvendte kodefølgningsteknikker, der anvendes i dag.

1. Fjern overflødige data

Den første kodehærdningsteknik, der skal anvendes i alle tilfælde, er at slippe af med alt i din kode, der ikke er nødvendigt.

Hvis du gør dette, strømliner du din codebase og reducerer den angrebsflade, du forsvarer.

Dette betyder at fjerne overflødige funktioner, fejlretningsoplysninger og så mange metadata som muligt. Kort sagt - alt, hvad der kan give en angriber en køreplan, der kan føre dem til en sårbarhed.

2. Transformér dataene

Den næste ting at gøre er at omdanne de data, som din kode behandler, for at gøre dem uigenkendelige.

Taktik som at erstatte værdier med udtryk, ændre formatet på det datalagring, du bruger, eller endda bruge binære versioner af din kodes tal, tilføjer alle kompleksitet. Og den kompleksitet vil gøre det vanskeligt for nogen at reverse-engineering din kode for at få noget nyttigt ud af det.

For eksempel kan du bruge strengkryptering til at gøre tekststrenge i almindelig tekst ulæselige. Strengkryptering kan bruge simpel base64-kodning, som ville vende denne kode:

String s = "Hello World"; Into: String s = new String(decryptString("SGVsbG8gV29ybGQ="));

Selvom det ikke er svært for en erfaren programmør at få øje på, hvad der foregår her, er det tidskrævende og frustrerende at skulle håndtere dekryptering af adskillige strenge.

Og når det kombineres med nogle af de andre kodeforblændelsesteknikker, er datatransformationer en effektiv første forsvarslinje.

3. Brug tilblivelse af procesordre

Et af de udfordrende krav til tilslørende kode er, at du stadig har brug for din kode til at fungere som beregnet, når du er færdig.

Men der er intet, der siger, at du skal udføre din kode i nogen logisk rækkefølge. Hvis du blander din kodes rækkefølge for operationer, kan du stadig opnå det rigtige resultat - men gør det langt sværere for en tredjepart at forstå, hvad din kode laver.

Den eneste advarsel er, at du skal være forsigtig med ikke at oprette for mange meningsløse sløjfer og blindgange, fordi du ved et uheld kan bremse din kodes udførelsestid.

Se som eksempel på følgende uddrag, der beregner summen og gennemsnittet af 100 tal:

int i=1, sum=0, avg=0 while (i = 100) { sum+=i; avg=sum/i; i++; }int i=1, sum=0, avg=0 while (i = 100) { sum+=i; avg=sum/i; i++; }

Ved at tilføje en betinget variabel er det muligt at skjule, hvad koden laver. Dette skyldes, at en analyse af funktionen ville kræve viden om, hvad der bliver input til den til at begynde med.

I det følgende uddrag skaber den betingede variabel 'tilfældig' en mere kompleks kodestruktur, der gør det langt sværere at dechifrere:

int random = 1; while (random != 0) { switch (random) { Case 1: { i=0; sum=1; avg=1; random = 2; break; } case 2: { if (i = 100) random = 3; else random = 0; break; } case 3: { sum+=i;avg=sum/i ; i++; random = 2; break; } } }

4. Prøv debug obfuscation

Nogle gange kan en bestemt angriber lære alle mulige nyttige oplysninger om din kode ved at undersøge dens fejlretningsoplysninger.

Og i nogle tilfælde finder de måske nøglerne til at afsløre nogle af de andre tiltrækningsteknikker, du bruger.

Så hvor det er muligt, er det en god ide at fjerne adgang til fejlretningsoplysninger. Og når det ikke er en mulighed, er det vigtigt at maskere alle identificerende oplysninger i fejlretningsrapporten.

5. Brug adresse-randomisering

For almost thirty years, errors related to memory handling have been the most common software vulnerabilities hackers exploit – even though every programmer knows that the problem persists.

And it's not just among beginners. Around 70% of the vulnerabilities in Google's Chrome web browser stem from memory errors.

The reality is, it's all but impossible to prevent all memory programming errors, especially if you're using languages like C and C++. But what you can do is include some memory randomization features in your code that will help.

At execution, if your code and data's virtual addresses get assigned random values, it gets much harder to find and exploit any unpatched vulnerabilities.

Plus, it adds another benefit, too. It makes it so that even a successful hack of your code is difficult – if not impossible – to replicate. That alone makes it much less likely that an attacker will waste their time trying to hack your software.

6. Rotate the Obfuscated Code

As much as the above techniques work to frustrate attackers, they're far from a perfect defense. Anyone with enough time and skills will still find a way to defeat them. But that brings us to one of the most essential obfuscation techniques of all.

Since all obfuscation techniques aim to increase the complexity of an attacker's work, anything you can do to set them back to square one is a great defensive measure. So, to keep your code protected, use the internet to your advantage.

You can issue periodic updates that rotate the nature and specifics of the obfuscation techniques you're using. Every time you do, all the work someone may have been putting into cracking your software becomes a waste of time.

If you rotate your obfuscation tactics often enough, it won't be worth it for anyone to try and keep up an analysis long enough to succeed.

Security Through Obscurity

The bottom line here is that there's no such thing as 'unhackable' code. No matter how hard a programmer tries, there's always going to be a vulnerability somewhere. Not that you shouldn't keep trying, though.

But in the real world, your code doesn't have to be perfect. It just has to be hard enough to crack that nobody in their right mind would bother trying. And for those who aren't in their right mind, it just has to be complicated and time-consuming enough to keep them at bay.

And that's just what the six tactics above can help you accomplish. But remember, no defense comes without a cost. When deploying these options, make sure to weigh the execution-time penalties they may create against the benefits they provide.

If you're working on something especially sensitive, throwing every possible curveball might be worth it. But if you're writing a quote of the day generator – maybe don't worry as much.

Men du vælger at gå videre, men glem aldrig at tage dig tid til at hærde din kode på den ene eller anden måde. Det er bare den rigtige måde at gøre tingene i en verden fyldt med cybersikkerhedstrusler rundt om hvert hjørne.

Fremhævet billede af ThisIsEngineering fra Pexels.