De beschrijving van hoe Google zijn Password Checkup tool implementeert klopt niet. Er komt geen homomorphic encryption aan te pas, in tegenstelling tot bij Microsoft. Beide gebruiken PSI, maar Googles techniek stopt bij een
Oblivious Pseudo-Random Function (OPRF), terwijl het bij Microsoft OPRF + HE is. De OPRF bij Microsoft is echter niet integraal voor PSI, maar maakt hun protocol maliciously secure en helpt het met performance. Voor Google is OPRF = PSI.
Google gebruikt 2 zaken: k-anonymity en EC-OPRF. Voor EC-OPRF is het idee dat je een invoer (de hash van je email + wachtwoord) kan mappen tot een punt op een elliptic curve. Dan genereer je een geheime sleutel k1 die je gebruikt om een
scalar multiplication (de som van je punt met zichzelf) uit te voeren op dat punt. Om dit idee makkelijker te maken, denk dat je een punt op een cirkel x keer verplaatst met een bepaalde afstand. Als je niet weet hoeveel x is, kan je onmogelijk achterhalen wat de originele locatie van je punt was. Dit is je versleuteld resultaat dat je doorstuurt naar Google. Zij hebben hetzelfde gedaan met alle 4 miljard entries met hun sleutel k2. Nu nemen ze je versleutelde data, en voeren ze nogmaals dezelfde operatie uit, maar dan met k2. Dat sturen ze terug naar de gebruiker, die de eerste scalar multiplication ongedaan kan maken met hun eigen sleutel. Dit geeft je je eigen input, versleuteld met de sleutel van Google die je niet kent (het idee achter Oblivious Pseudo-Random Functions).
Om nu tot PSI te komen waar enkel de gebruiker de overlap leert zou Google normaal gezien al hun data moeten doorsturen. Dan is het gewoon een kwestie om na te gaan of jouw input versleuteld met Googles key gelijk is aan 1 van de entries in hun tabel. Er zijn echter 4 miljard rijen, dus veel te groot om door te sturen. Daar gebruiken ze dan k-anonymity voor. Buiten de versleutelde data heb je ook de eerste 2 karakters van de hash van je data. Dus die stuur je door naar Google, en Google stuurt je de 60000 rijen terug die ook dezelfde eerste 2 karakters hebben.
Zoals MatHack hierboven vermeldt is dit identiek hetzelfde systeem als dat van Have I Been Pwned voor hun API. Alleen slaan zij gewoon de SHA-1 hashes op. Het "probleem" met dit systeem is dat deze hashes deterministisch zijn (mits salt). Beide partijen moeten enkel dezelfde salt gebruiken om te kunnen matchen, het algoritme achter SHA zelf is publiekelijk bekend. Als je hun data binnenkrijgt, zou je buiten de match dus kunnen proberen om de rest te brute-forcen met andere wachtwoorden. Google kan niet alleen op eender welk moment hun key veranderen en alle data opnieuw versleutelen, je kan hun 60000 entries ook veel moeilijker proberen te brute-forcen omdat de search space van keys veel groter is dan die van typische wachtwoorden. En tot slot, je kan niet gewoon een nieuwe combinatie van email + wachtwoord matchen met Googles data zonder Google bij de berekening te betrekken. Zij moeten immers jouw data versleutelen met hun key. Dus offline brute-force attacks zijn niet mogelijk.