Fingeravtryck som autentiseringsmetod
Fingeravtrycksscanners är något som idag frekvent används som biometrisk autentisering för bland annat datorer och telefoner. Eftersom det mönster som bildas av huden på våra fingrar är unik för varje individ, till och med för enäggstvillingar (eftersom detta mönster bildas delvis genom en slumpartad process i livmodern), samt att fingrar generellt är ett lättillgängligt “redskap” ter sig fingeravtryck vara en smidig metod för autentisering av individer. I dagens blogginlägg ska vi titta lite närmare på bakomliggande metoder för fingeravtryck som autentisering.
Smidighet
För en enhet som man låser upp många gånger varje dag (t.ex. en mobiltelefon) är hastighet och smidighet för autentisering en viktig aspekt för många användare. Som alla som använt en elektronisk fingeravtrycksscanner vet råder det inga tvivel om att denna metod för autentisering är svårslagen vad gäller hastighet. Jämförelsen mellan att lägga ett finger på läsaren en gång är förstås omöjligt att slå för alla typer av lösenord där man behöver skriva in flera tecken. Det finns dock ännu snabbare autentiseringsmetoder som t.ex. ansiktsigenkänning. För enheter där autentisering bara behövs ett fåtal gånger om dagen bör någon sekunds skillnad i hastighet inte vara en avgörande faktor för vilken autentiseringsmetod man väljer att använda.
Vid första anblick kan man tro att en fingeravtrycksläsare även eliminerar behovet att memorera ett lösenord eller pinkod, då det inte ska behövas för autentisering. Dock är detta sällan fallet eftersom fingeravtrycksläsare inte är lika pålitligt som en pinkod. De misslyckas ofta matcha fingeravtryck mot de tidigare registrerade avtrycken. Saker som att fingret läggs mot scannern med olika tryck eller att scannern är smutsig kan göra att matchning mot tidigare registrerade fingrar misslyckas. Därmed behöver fingeravtrycksläsare ha möjlighet till alternativ autentiseringsmetod, vilket ofta innebär att man även behöver memorera en en pinkod. Att många fingeravtrycksläsare kräver pinkod efter ett fåtal misslyckade försök att matcha ett avtryck är även en säkerhetsfunktion som gör det svårare för en angripare att komma in i enheten.
Teknik
Den vanligaste typer av fingeravtrycksscanner som används idag bygger på kapacitiv teknik. Detta är i grund samma teknologi som används i majoriteten av alla touchscreens som finns för handhållna enheter som mobiltelefoner och tablets. Skärmen känner av skillnader i kapacitans mellan den del av ett finger som vilar mot skannern och den del av fingret som inte gör det, därmed kan en högupplöst bild av mönstret på fingret skapas. En algoritm identifierar sedan drag som går att definiera på ett entydigt sätt, t.ex. punkter där linjer slutar eller möts (se bild nedan), vilka kallas “minutiae”. Antal och relativa positioner mellan dessa minutiae omvandlas till en unik identifierare för ett finger.
Spara fingeravtryck som kryptonyckel
Låt oss göra en snabb utsvävning till hur nyckelhantering hanteras för “vanliga“ lösenord, där lösenordet består av tecken inskrivna via ett tangentbord. Här omvandlas knapptryckningar till binär kod.
Password blir t.ex. 0101000001100001011100110111001101110111011011110111001001100100
När lösenord sparas gör detta lämpligen genom att lösenordet körs genom en kryptografisk hash-funktion, vilket är en envägsfunktion. Samma input ger alltid samma output, men funktionen är omöjligt att backa. DVS har du output kan du inte veta vad input var. Denna förmåga är användbar om man vill spara lösenord. Man sparar den hashade versionen av lösenordet. När man ska kolla om ett lösenord är korrekt kör man det som en användare angivit genom samma kryptografiska hash-funktion, och jämför sedan det man får ut med den tidigare sparat. Är det samma output vet man att man haft samma input, och därmed måste lösenordet vara korrekt. Även om någon får tag på den hashade versionen av lösenordet vet personen inte vad lösenordet i sig är, och kan därmed inte ta sig in i systemet.
Återgår vi till fingeravtryck, där den den unika identifieraren för ett finger bygger på relativa positioner mellan minutiae på fingret. Som med de flesta saker i den fysiska världen är fingeravtryck inte helt beständiga och därmed inte 100% replikerbara. Sår på fingrar, skräp på detektor, svullna fingrar, fuktig scanner, osv gör att två avläsningar av ett samma finger inte kommer att ge exakt samma unika identifierare. Detta försvårar lagringen av denna identifierare. Skulle man använda en vanlig kryptografisk hash-funktion skulle även extremt små förändringar i identifieraren ge en ny helt unik output, och därmed misslyckas autentiseringen. Detta är en bra egenskap när man har att göra med vanliga lösenord då den minsta möjliga förändringar där är fördämningen av mellan ett tecken till ett annat.
Password binärt är 0101000001100001011100110111001101110111011011110111001001100100
Qassword binärt är 0101000101100001011100110111001101110111011011110111001001100100
Körs detta genom en kryptografisk hash-funktion som t.ex. SHA256 nedan blir det helt olika output:
Password blir E7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a
Qassword blir 06cd9423ada2b4af7e1a8d01181599508fb32f682a44712e1ee62c446e50ccff
Knappt ett tecken lika!
Skulle detta användas för fingeravtryck skulle alltså även en extremt liten förändring göra att autentiseringen misslyckades. Fingeravtrycksigenkänning är inte lämpat att hanteras i termer om strikt sant eller strikt falskt. Istället används så kallad suddig logik, som betyder att man hanterar saker på en skala, från tveklöst falskt (0) till tveklöst sant (1). Godkänd autentisering ges vid ett tillräckligt högt sanningsvärde (t.ex. 0.95).
För att spara information som är kopplad till den unika identifieraren för ett finger, utan att ge ut information om hur fingret ser ut behöver man använda en unik typ av hash-funktion, så kallad suddig extraherare. Målet är att kunna använda värden för kryptografiska ändamål som plockas från en ungefärlig input, tagna i närheten av ursprungliga värden (hur fingret såg ut när det först registrerades). En unik binär kod ska extraheras från input, där det finns visst brustolerans i inputvärden. Små förändringar i input ska ge samma output i form av en unika följd av tecken, som används som nyckel för kryptografiska ändamål, t.ex. autentisering. Dessutom är det änskvärt att funktionen ha samma egenskaper som andra kryptografisk hash-funktioner, dvs den ska inte gå att backa och förändringar (om större än brustoleransen) ska ge en output som är oigenkännlig och till synes slumpartad. Detta görs i två steg, där första steget är felkorrektion där man delvis eliminerar brus och andra delen liknar vanliga hash-funktioner.
Felkorrektion
Det finns många möjliga sätt att göra felkorrektion. För att illustrera principen tittar vi på en förenkling. Här skapar man en mappning mellan potentiellt möjlig input-rymd och felkorrigerad output, en så kallad hjälpsträng. Denna mappning bör optimeras genom att välja en funktion som gör slumpmässiga gissningar osannolika att mappas mot korrekta värden, samtidigt som man försöker öka chanser att små fel av input mappas mot en korrekt output, samt att kännedom om mappningen inte ska ge ut information om användarens fingeravtryck. Nedan ges en visualisering av hur denna mappning kan se ut i ett förenklat fall med bara två dimensioner på input.
En nackdel med den typ av mappnig som visas ovan är att en angripare med kännedom om hur mappningen ser ut kan utesluta en stor del av den möjliga input-rymden genom att göra antagandet att den sökta punkten ligger nära centrum av någon av de definierade områdena. Om detta inte var fallet, dvs punkten låg nära en kant mellan två områden, skulle det innebär att små fel i input lätt kan mappas mot fel värde. Därmed är mappningen inte bra vald efter optimerings-principerna. Därmed ger kännedom om hur denna mappning ser ut en angripare information som hjälper den komma in i systemet. Och ju större fel-korrektionen är (DVS större frånsteg från orginalvärdet ger fortfarande rätt output), desto fler möjliga inputs kan uteslutas. Detta blir en avvägning mellan säkerhet (tillåta endast väldigt små fel = svårare att forcera) mot smidighet i användandet (större fel tillåts = mindre risk att bli nekad autentisering). Ett sätt att delvis komma runt detta är att använda en stor mängd dimensioner i inputen. För fingeravtrycksscanner skulle detta innebära att man tittar på många minutea punkter. Ju fler dimensioner man har desto större fel kan tolereras i varje individuell input.