Datasikkerhet à la hakkespettboken
De fleste som kjenner Donald Duck, har kanskje på ett eller annet tidspunkt ønsket seg en kopi av hakkespettboken til Ole, Dole og Doffen. Dette oppslagsverket, som etter sigende ble reddet fra ruinene da biblioteket i Alexandria brant ned, inneholder visstnok all kunnskap i verden. Jeg ser for meg at det bl.a. inneholder en beskrivelse av hvordan sensitiv informasjon kan skjules for uvedkommende ved å skrive den med usynlig blekk!
I dagens digitale verdens virker det kanskje usannsynlig å skulle hente sikkerhetsmekanismer fra en bok med opprinnelse fra før det nevnte bibliotek brant ned i år 47 f.kr, men det kan vi faktisk!
Whitespace
For nøyaktig 18 år siden ble programmeringsspråket Whitespace lansert av Edwin Brady og Chris Morris. Dette er et programmeringsspråk som kun bruker whitespace for sin syntaks. Mer spesifikt er det kun tegnene space, tab og linjeskift som er i bruk. Disse tre tegnene har det til felles at de er helt usynlige - akkurat som usynlig blekk!
En morsom sak med Whitespace er at alle andre tegn enn de tre nevnt over skal ignoreres av kompilatoren, noe som gjør at Whitespace-kode kan blandes med andre programmeringsspråk, eller vanlig tekst, og er et ypperlig verktøy hvis man vil lage et polyglot. Beklager, polyglot var et sidespor. Tilbake til det usynlige blekket!
For å markere 18-års dagen til språket, har jeg laget en ny egenskapstype, SuperSecretString, til Episerver som lagrer tekster som Whitespace-kode. Redaktørene skriver vanlig tekst, slik de pleier - men i databasen blir teksten lagret som Whitespace-kode. Når Episerver henter teksten tilbake for å vise den på en side, eller i redaktørmodus blir Whitespace-koden kjørt slik at resultatet kommer tilbake.
Så hva er da poenget, hvis ingen merker noe forskjell? Jo, i databasen blir verdiene skrevet som med usynlig blekk! Hvis noen får tilgang på databasen, kommer ingen sensitive opplysninger på avveie. Hvis noen printer hemmelighetene dine, vil ingen kunne se dem!
Installasjon
Så hvordan fungerer dette? Jo, bare installer NuGet-pakken fra den offisielle nuget.org-feeden, og for de utvalgte egenskapene som inneholder spesielt sensitiv informasjon legger du på attributtet: [BackingType(typeof(PropertySuperSecretString))]
, slik:
[Display(Name = "Super secret string property")]
[BackingType(typeof(PropertySuperSecretString))]
public virtual string Secret { get; set; }
Og det er alt! I redaktørmodus ser egenskapen ut som en helt vanlig tekst-egenskap.
Sjekk databasen
Hvis du vil se hvordan verdiene ser ut i databasen, eller rettere sagt se at du ikke kan se dem, kan du kjøre følgende SQL-spørring. Spørringen vil liste ut alle egenskaper av type SuperSecretString
, sammen med side-id, navn på siden, språket, egenskapen og verdien.
SELECT
c.pkID,
cl.Name,
lb.LanguageID,
pd.Name,
cp.LongString
FROM
tblContent c,
tblContentLanguage cl,
tblLanguageBranch lb,
tblcontentProperty cp,
tblPropertyDefinition pd
WHERE
c.pkID = cp.fkContentID AND
c.pkID = cl.fkContentID AND
cl.fkLanguageBranchID = lb.pkID AND
cp.fkPropertyDefinitionID = pd.pkID AND
pd.fkPropertyDefinitionTypeID IN
(
SELECT pkID
FROM tblPropertyDefinitionType
WHERE Name = 'Super Secret String'
)
AND cp.LongString IS NOT NULL
I SQL Management Studio ser egenskapen helt tom ut.
Så hvordan kan du hente ut Whitespace-koden fra databasen? Jo, hvis du huker av for følgende innstilling som bevarer linjeskrift, og deretter starter SQL Management Studio på nytt.
Nå kan du kopiere verdien uten at SQL Management Studio fjerner de nødvendige linjeskiftene. Uensett dine innstillinger, vil dette selvsagt fungere knirkefritt i Episerver.
Test med en interpreter
Hvis du vil sjekke hvordan den usynlige verdien er bygget opp, kan du bruke en Whitespace interpreter. Det finnes flere, men denne er av de bedre.
Øverst til venstre ser man selve Whitespace-koden, der space er markert rosat og tab lilla. Linjeskift er linjeskift. Til høyre ser man debuginformasjon, og kommandoene som Whitespace-koden tilsvarer. Nederst til venstre ser du output fra programmet etter å ha klikket «Run», og den viser det samme som i Episerver redaktørmodus.
Eksempelkode
Test gjerne med å kopiere følgende kode inn i interpreteren. Marker alt innholdet i ruten under, pass på at du får med ALLE linjene, kopier, lim inn i interpreteren og klikk «Run».
Limte du koden inn i interpreteren og klikket «Run»?
Hold dine hemmeligheter hemmelige, skriv med usynlig blekk!
For de spesielt interesserte er også kildekoden tilgjengelig.