Vidste du, at de sikre webtjenester, du logger ind på med en adgangskode, faktisk ikke kender den adgangskode, du bruger til at logge ind med? Hvorfor er det sådan? Og hvordan er det overhovedet muligt? Bevæbnet med viden fra vores artikel om Hash-funktioner og informationssikkerhed kan vi give svar på disse spørgsmål.
En usofistikeret login-procedure
Lad os først se på, hvordan en usofistikeret login-procedure ville se ud. Vi logger ind på en webtjeneste på den sædvanlige måde med et kontonavn og en adgangskode:
Vores usofistikerede webservice har en tabel i sin database med alle kontonavne og deres tilhørende adgangskoder:
Webservicen slår først kontonavnet fra den udfyldte login-formular op i sin database. Hvis navnet findes i databasen, sammenligner tjenesten også adgangskoden fra login-formularen med den tilhørende adgangskode i databasen. Hvis adgangskoderne matcher, udføres registreringen. Ellers bliver registreringen afvist. Ved første øjekast er dette en sikker login-procedure. Kun dem, der er i besiddelse af et gyldigt kontonavn og kender den tilhørende adgangskode, kan få adgang til den tilsvarende konto. Alle andre bliver nægtet adgang. Så langt, så godt! Men hvad er det lige, der er så usofistikeret ved denne procedure?
Problemet er, at adgangskoderne er gemt i en database. Det betyder, at de potentielt er kendt af alle, der har adgang til databasen, herunder webserviceoperatørerne og deres medarbejdere. Desuden er det nu almindelig praksis for mange virksomheder at outsource den faktiske drift af de webtjenester, de tilbyder, til amerikanske cloud computing-udbydere som Amazon Web Services eller Google Cloud. Derfor kan vi antage, at operatørerne og medarbejderne hos disse cloud computing-udbydere i princippet også har adgang til databasen og dermed til vores password. Derudover kan kriminelle selvfølgelig også få uautoriseret adgang til dataene i databasen.
Desuden er det ingen hemmelighed, at de fleste brugere af webtjenester genbruger det samme password til flere tjenester. Derfor vil den, der har fået fat i adgangskoden til en målgruppes Facebook/Twitter-konto eller online-rejsebureau, med lidt held også have adgangskoden til deres e-mail, netbank, personlige kalender, en datingplatform og intranettet i den virksomhed, hvor målgruppen arbejder. Det økonomiske incitament til at stjæle adgangskoder fra en hvilken som helst webtjenestes database er tilsvarende højt, selv hvis denne webtjeneste ikke selv er et lukrativt mål! Spørgsmålet er: Hvordan løser vi dette problem?
En mere sofistikeret login-procedure
Lad os huske tilbage: Webtjenesten beskrevet ovenfor har en tabel i sin database med alle kontonavne og de tilhørende adgangskoder:
Vi tilpasser denne tabel på følgende måde. I stedet for at gemme adgangskoderne anvender vi en kryptografisk hashfunktion efter eget valg på adgangskoderne:
Hvad en kryptografisk hashfunktion er, er beskrevet i artiklen Hashfunktioner og informationssikkerhed. I stedet for adgangskoderne gemmer vi så de resulterende hashværdier i databasen:
Det ændrer kun login-proceduren en smule. Vi logger stadig ind på den sædvanlige måde med et kontonavn og en adgangskode:
Webtjenesten slår først kontonavnet fra den udfyldte loginformular op i sin database igen. Men i det næste trin er den nye procedure anderledes. Hvis navnet findes i databasen, anvendes hash-funktionen på adgangskoden fra login-skærmen. Først derefter sammenlignes den resulterende hashværdi med den tilsvarende hashværdi i databasen. Igen sammenlignes adgangskoderne ikke længere med hinanden, men kun med deres hash-værdier. Hvis hashværdierne stemmer overens, gennemføres login. Ellers nægtes login.
Bortset fra brugen af hash-funktionen er der ikke ændret noget i login-proceduren. Ud fra egenskaberne ved kryptografiske hashfunktioner følger det, at sammenligning af hashværdierne er lige så god som direkte sammenligning af adgangskoderne. Men nu er selve adgangskoderne ikke længere gemt i webtjenestens database. Enhver, der får adgang til databasen - autoriseret eller uautoriseret - har ikke længere adgang til adgangskoderne, men kun til deres hash-værdier. Det ovenfor beskrevne økonomiske incitament til at stjæle adgangskoder fra en webtjenestes database er dermed elimineret, fordi adgangskoderne nu ikke længere er indeholdt i databasen.
Hvordan fungerer det i praksis?
Vi håber, at vi har været i stand til bedre at forklare, hvordan det er muligt, og hvorfor det er almindelig praksis, at sikre webtjenester ikke engang kender de adgangskoder, som vi bruger, når vi logger ind. I praksis øges sikkerheden ved denne procedure yderligere ved at generere hashværdierne med en specialiseret kryptografisk hashfunktion (bcrypt) og desuden forbinde dem med en hemmelig tegnstreng (salt), der dækker hele databasen, før hashfunktionen anvendes. Men det vil vi ikke komme nærmere ind på her.
Har du glemt din adgangskode?
Hvis du har glemt din adgangskode til en webtjeneste, kan du anmode om en nulstilling af adgangskoden fra de fleste webtjenester. Du vil så modtage en e-mail med et link, der fører dig til en formular, hvor du kan angive et nyt kodeord. Vi ved nu, hvorfor dette håndteres så akavet: webtjenesten kender ikke din gamle adgangskode. Desværre er det ikke alle virksomheder, der følger denne etablerede sikkerhedspraksis endnu. Hvis du via e-mail eller i en telefonsamtale med et supportteam fortæller, at du har glemt din adgangskode, og du så rent faktisk får oplyst din adgangskode, kan du konkludere, at virksomheden ikke overholder moderne standarder for informationssikkerhed. I hvert fald bør du sørge for, at du ikke bruger dette password i nogen anden sammenhæng. Hvis du konsekvent vil bruge et separat password til hver webtjeneste, bør du bruge en password manager. Så behøver du ikke længere at huske en masse individuelle adgangskoder og har den ekstra bonus, at du i stedet kan oprette tilfældige adgangskoder af høj kvalitet. Der findes browser-plug-ins til populære password managers, som endda udfylder login-skærmene til dine webtjenester for dig. Sjældent har bekvemmelighed og sikkerhed mødtes så smukt.