Verifikation af alder
Når du verificerer din alder i nuværende løsninger, overdeler du. Det vil sige du afgiver flere informationer om dig selv end nødvendigt. Den anden part behøver ikke kende dit CPR nummer, eller alt hvad der står i dit kørekort. De behøver ikke engang at kende din fødselsdato. De har kun brug for at vide at din alder ikke er under en eller anden tærskelværdi. Ja eller nej. Det er et binært spørgsmål.
Det kan være du tænker at du kan klare det ved at bemyndige dem til at stille autoriteterne deres ja-nej-spørgsmål. Men det skaber et andet problem. På den måde ville autoriteterne kende til dine aldersverifikationer. Det er unødvendigt. Det skaber osse incitamenter for uetiske autoriteter, til at opsætte regler om alderskrav og andre krav, for at øge overvågningen af borgerne, mens der på papiret ikke er nogen overvågningsstat.
Men der er en teknisk løsning, som gør at man kan verificere sin alder, og kun afgive den ene bit information som den anden part behøver, på en måde hvor ingen andre parter vil kende til verifikationen. Løsningen er at bruge et såkaldt zero knowledge bevis (ZKP på engelsk).
Sådan et virker normalt ved at starte noget tungt maskineri op - såsom at konstruere et kredsløb, lave det om til polynomier, og så videre. Men i dette tilfælde er det ikke nødvendigt, for der er en simpel og elegant løsning. Den bruger hash-kæder.
Løsningen bruger kun nogle få basale kryptografiske byggesten.
Det er alt! Jeg sagde jo det vil blive simpelt...
Alice og Bob eksempel
Lad mig starte med et opdigtet eksempel. Der er tre spillere:
A: Aldersautoriteten Alice. Hun er Bobs mor.
B: Drengen Bob. Han er 7 år gammel.
C: Cykeludlånet ved det feriecenter hvor Bob og hans familie er. De udlåner tohjulede cykler, tricykler og el-cykler.
For at låne en tohjulet cykel skal man være mindst 5 år gammel. Ellers får man en tricykel.
Så hvordan kan Bob bevise han er mindst 5, uden at røbe sin faktiske alder på 7, og uden at Alice skal bøvle med det?
Alice vælger et tilfældigt tal r, og bruger så den offentligt kendte hash funktion H, til at iterere 7 gange på r. Det giver hende denne commitment: c = H7r
Alice giver (r,c) til Bob.
Hvis han ønsker det, kan Bob tjekke H7r ≟ c for at være sikker på det er i orden.
Bob udregner så beviset: p = H2r
Bob bruger 7 - 5 = 2 iterationer, fordi det levner den mindste kæde som Cykeludlånet har brug for at kende.
Han giver så udlånet (p,c).
Cykeludlånet tjekker om H5p ≟ c
Læg mærke til at da hash funktionen er en-vejs, kan udlånet ikke gætte hvad der kom før p, for slet ikke at tale om hvad r er. De finder ikke ud af andet om Bobs alder, end at den er 5 eller mere. De har heller ikke brug for at få fat i Alice for at spørge hende om Bob er gammel nok.
Udlånet godtager beviset, så de låner Bob en flot blå cykel med et elektrisk to-tonet horn.
Det var det hele! Meget elegant, ikke sandt?
Men vi har brug for et par ændringer før vi er helt i mål.
Bob kunne forfalske
Bob ønsker sig inderligt en af el-cyklerne. Men alderskravet er 15 år.
Han kan ikke lave beviser for mere end 7 år med det r og c han har fra Alice. Medmindre han snyder.
Bob kunne iterere H nogle flere gange på det c han har, og så give denne forfalskede commitment til udlånet. Han kunne endda køre gennem hele processen ved selv at vælge et r og udregne c, bare med 15 iterationer af H.
En måde at undgå det på, er at udlånet begynder at kræve at commitments er skrevet under af autoriteter som de stoler på. Så Alice skal skrive commitmenten under inden hun giver den til Bob.
Diana kunne medvirke
Bobs storesøster, Diana, er 15 år gammel. Hun fik osse en commitment af Alice.
Diana er ikke så interesseret i Cykeludlånet, så hun kunne give sit r og sit c til Bob.
En måde udlånet kunne undgå det på, er at kræve, at commitments indeholder et billede af ejerens underskrift, og kombinere det med en procedure hvor man skal underskrive sit bevis når man afleverer det til udlånet.
Da Alice lavede commitments til Bob og Diana, skulle hun have lagt billeder af deres underskrifter i hver af dem respektivt. Hvis Bob forsøgte at bruge Dianas commitment, kunne udlånet se at underskriften ikke passede.
Det hele samlet
Protokollen overført til den virkelige verden, ser samlet set sådan ud:
Tallet r skal vælges tilfældigt fra billedmængen af H. Det vil derfor, med andre ord, se ud som outputtet fra H.
Når B sender beviset til C, beviser han samtidig at han har privB nøglen.
Protokollen kan se anderledes ud end den som er vist her, men kernen af den, med en hash-kæde som bliver forkortet, er den samme i alle udgaver.
Den tidligste udgave jeg har kunnet finde blev publiceret tilbage i 1995 af Pedersen i "Electronic Payments of Small Amounts". Men da den er så simpel, er det ikke usandsynligt at der findes tidligere udgaver.
Den tekniske betegnelse for protokollen er range bevis (range proof på engelsk).
Problemer
Det første problem er at man kun kan bevise at k er større end eller lig med en tærskelværdi. Det ville være rart hvis man osse kunne bevise mindre end eller lig med relationer. Hvis man har en hård øvre grænse, er det muligt. Men det har man sjældent, og så er større end eller lig med beviser det eneste der kan lade sig gøre.
Det andet problem er skalérbarhed. Det tager tid lineært i k eller tærskelværdien, at udstede og at tjekke. Det er for meget i mange tilfælde. Såsom beviser for indeståendet på en bankkonto. Man kunne selvfølgelig tælle i tusinder, og så kan det alligevel være det går an. Men der er en grænse for granulariteten som man i praksis kan opnå med denne protokol.
Variationer
Der findes digitale signatur metoder som kun bruger hash funktioner. Så det skulle være muligt at lave protokollen på en måde der ikke bruger public key kryptografi.
I nogle brugsscenarier, vil den granularitet man har brug for, være forskellig i den lave og den høje ende. Der er mange måder at imødekomme det på. En er at bruge logaritmer.
Nogle har arbejdet på at kombinere flere hash-kæder med forskellige skridtstørrelser. Det løser skaleringsproblemet. Men det går samtidig ud over privacy, da noget information om k bliver afgivet.
Fremtiden
Hash-kæder og protokoller, i stil med den beskrevet her, er en del af den store gruppe af SSI teknologier, som bliver opbygget i disse år. Der forskes ret aktivt indenfor feltet, så vi kunne være heldige at en eller anden finder en forbedret udgave. Men protokollen som den er, er helt fin i en række brugsscenarier - og den er dejligt simpel.


