Trustaige Research Notes 14 October 2026

A CAPTCHA that does not need to watch you; Proving a person without asking who

Trustaige Privacy Research · Published 14 October 2026

Bot defence has grown into fraud platforms that score every visitor by watching them. We replaced the CAPTCHA on our own forms with a passkey: one tap proves a person was present, the site learns nothing else about them, and neither do we.

The bargain behind the checkbox

The checkbox that reads I’m not a robot began as a test. Show a person something a machine cannot read, and whoever reads it is a person. That test no longer holds. A 2023 study timed 1,400 people on the CAPTCHAs of the most visited websites and found them solving with 50 to 85 per cent accuracy, against 85 to 100 per cent for the automated solvers published in the attack literature, which were also faster in all but one case.1 The puzzles a solver still cannot manage are relayed to people paid to solve them, at retail prices that were already one or two dollars per thousand in 2010.2 What protects a form today is rarely the puzzle. It is everything collected around it.

The industry has drawn the obvious conclusion. Bot defence has become fraud defence: platforms that observe each visitor’s device, network, behaviour and history, compute a score, and offer, in Google’s description of its own product, “bot, account, and transaction protection across the agentic web”.3 What a low score costs the visitor is left to the site: a puzzle, a second factor, or a refusal. This works, to a degree, and it works by watching.

That bargain has costs that fall in three places. The visitor is observed by a third party in order to fill in a form, and has no view of what was collected or how long it is kept. The site receives a score between 0.0 and 1.0 with reason codes, which say what the model concluded but give the site nothing it can show a customer it has turned away. And the people most likely to score badly are ordinary ones whose circumstances look unusual from a distance: a new phone, a shared address on a mobile network, an assistive technology, a browser that blocks trackers. Each of them is sent down the harder path, and where that path is a puzzle, it is where accessibility already fails.4 The arrival of software agents that operate browsers on a person’s behalf makes behaviour a weaker signal each year, not a stronger one.

Two kinds of free check already drop the puzzle. Cloudflare’s Turnstile runs “a series of small non-interactive JavaScript challenges to gather signals about the visitor or browser environment”, among them proof-of-work and checks for “browser-quirks and human behavior”, and a site must send each token back to Cloudflare to be validated before it means anything.5 It collects less than a fraud platform, but it still decides by examining the browser, and the vendor still takes part in every check. Open-source proof-of-work checks such as ALTCHA go further on privacy: they collect nothing, and the site verifies the answer on its own server with “no third-party service call required”.6 Their price is computation, and computation is unevenly priced. A 2003 paper on such functions warned that they may be “ineffective against malicious users with high-end systems, prohibitively slow for legitimate users with low-end systems, or both”,7 and a vendor of one writes that “some devices solve the PoW challenge in seconds, others take ages — or give up”.8

A different question

We replaced the CAPTCHA on our own forms with a check that asks a different question. It does not ask whether a visitor behaves like a person, or whether their device will spend a few seconds computing. It asks whether a person, a moment ago, confirmed something on a device they hold, with their fingerprint, face or screen-lock PIN.

That is what a passkey ceremony attests. When a passkey signs in, the device reports whether the user was verified, and it cannot report so without the person’s finger, face or PIN. Nearly every phone in use can do this: our field note on passkey readiness found that the cheapest smartphone each brand sells today can hold a passkey, and that the phones which cannot are those never updated past Android 8, or past iOS 15 on an iPhone 7 or older.9 The capability is already in visitors’ hands. What was missing was a way to turn one confirmation into a proof a website can check, without that proof becoming a record of where the person has been.

We call the result HumanProof. A visitor ticks I’m human, confirms with the phone’s or laptop’s own system prompt, and the website receives a token that says a person was here and nothing else.

Two lanes compare how each check is built. In the upper lane, a behavioural CAPTCHA draws five kinds of data from the visitor (device and browser, network address, mouse and touch, past activity, cookies) into the CAPTCHA vendor, which scores what it collected. The vendor hands the page a token only it can read, the website’s server sends that token back to be scored, and the vendor answers with a risk score of 0.3 and reason codes; the site decides what a low score means. In the lower lane, the person confirms with a fingerprint, face or PIN inside the boundary of their own device; a sealed request goes to Trustaige ID, which signs it without seeing the site and returns the signature; and a single-use token saying a person was here goes from the device straight to the website, which checks it with keys Trustaige ID publishes, without asking, and learns nothing about who.

What a site gains

Nothing to solve. There are no images, no audio clips and no timer. A visitor who already holds a passkey makes one tap and confirms with a fingerprint or PIN, the same gesture used to unlock the phone a hundred times a day. A visitor who does not is offered one in place, without leaving the form: one tap creates the passkey, and creating it is itself the proof. One confirmation yields a few proofs, which the browser keeps for that site alone for half an hour, so a person who fills in two forms in one visit confirms once.

The same answer every time. A check that scores behaviour can let a person through today and stop them tomorrow, because a new phone, a VPN, a shared mobile network or a browser that blocks trackers each moves the score, and the person cannot see why. HumanProof has no score and no threshold: a person who holds a passkey and confirms gets through, every time. When a request is refused, the site can say why in plain terms: no proof was given, the proof had already been used, or it is not valid for this site. Neither the site nor the visitor is left with you looked like a bot.

Nothing learned about the visitor, by anyone. The token is a Privacy Pass token, the IETF standard for anonymous authorization tokens.10 We sign it blind: the request we sign carries the site’s name in a form we cannot read, so we learn that a person proved, not where. The site learns that a person proved, not who. Two tokens from the same person cannot be linked to each other, and we cannot link a token to the ceremony that produced it. There is no cookie, no behavioural collection and no score. For a site that must account for the personal data it gathers, there is none here to account for.

A cost that falls on the attacker rather than the visitor. Every token requires a user-verified ceremony on a Trustaige identity. Each identity can draw only a limited number of tokens a day, each token can be spent once, and each is bound to the one site it was issued for, so a proof gathered elsewhere cannot be replayed on a site’s form. A puzzle costs a bot a fraction of a cent and costs a person their patience. A HumanProof token costs a person one tap and costs an operator an identity, a ceremony and a share of a daily allowance.

A check with no secrets to manage. A token is verified with our public keys, which are published at a well-known address, and the website’s own origin is part of what was signed, so the origin serves as the site key. Integration is a script tag on the page and one check on the server, and nothing in it needs to be kept secret.

A guard that stays shut. A request without a valid proof is refused, whether the widget was skipped, failed or never loaded. On our own forms, a failure to reach the verifier refuses the request rather than letting it through, because a guard that opens when its verifier is down can be removed by anyone who takes the verifier down.

Room to ask for more. A token states which tier signed it and nothing more. The first tier, Prove, means a verified passkey ceremony. The second, Prove+, adds a verified recovery contact behind the identity, so that each identity costs an operator a working inbox as well as a ceremony. A site can require the tier its risk warrants, and the visitor’s privacy is the same at every tier.

A clean line between people and their agents. Under this design a site does not have to guess whether a browser is driven by a person or by software. A person carries a proof of presence; an agent acting for a person carries a credential delegated by that person and naming them. A site can treat the two differently by design, rather than by inference from mouse movement.

A behavioural CAPTCHA HumanProof
What the visitor does Nothing, or a further step if the score is low One tap and a fingerprint, face or PIN
Whether the same person passes twice Depends on that day’s score Yes, whenever they confirm
What the site receives A risk score from 0.0 to 1.0, with reason codes A single-use token: a person proved, at a stated tier
What the vendor learns The visitor’s device, network and behaviour from page load, and each action the site asks it to score That a person proved; not the site, not which person
What it costs an attacker A solve, automated or bought An identity, a ceremony and a share of a daily allowance
When the vendor is unreachable Depends on the integration The request is refused

How it works, briefly

The ceremony runs in a small frame served from our identity service and embedded in the site’s page, so the visitor never leaves the page and the site never handles the passkey. On a successful ceremony the frame requests a small batch of blind-signed tokens, holds the spares for that site only, and hands one to the page. The tokens are publicly verifiable Privacy Pass tokens, RFC 9578 token type 2, built on RSA blind signatures.11 12

The idea is not ours alone. In 2021 Cloudflare tested accepting a hardware security key’s attestation in place of a CAPTCHA,13 and since 2022 Apple devices present Private Access Tokens, the same token type, with Apple as the attester.14 Both root the proof in the device and its maker. HumanProof roots it in a passkey on an identity the person holds, so it works on any phone or laptop that can hold a passkey, whoever made it.

sequenceDiagram
    participant P as Person
    participant F as Proof frame (Trustaige ID)
    participant I as Trustaige ID issuer
    participant S as Website server
    P->>F: Ticks "I'm human", confirms with fingerprint, face or PIN
    F->>I: Passkey assertion
    I-->>F: Allowance for a small batch of tokens
    F->>I: Blinded token requests (the site's name is hidden)
    I-->>F: Blind signatures
    F->>S: One token, sent with the form
    S->>S: Verify against published keys, for this site, not yet spent

The issuer sees a ceremony and a blinded request. It never sees the challenge, which carries the site’s name, and it keeps no record joining a ceremony to the tokens it produced. The site sees a token and the tier whose key signed it.

The difference from a scored CAPTCHA is in who takes part. In Google’s own description of its flow, the vendor’s script collects signals from the moment the page loads, and the site’s server sends each protected action’s token back to the vendor for an assessment, because only the vendor can read it.3 A HumanProof token can be read by anyone holding our published keys. The site can check it itself, without us; a site that prefers to ask us sends the token and nothing about the visitor.

Where we use it

HumanProof guards every request form on this site and the download of our reports. The reports are where the change is most visible. A report used to cost a reader their name, email address and organization, which we collected to keep robots from downloading in bulk. It now costs one tap, and we hold nothing about the reader afterwards. The same check guards the sign-up and contact forms on trustaige.com, where it replaced the third-party CAPTCHA we used before.

What it does not do

HumanProof is a proof of presence, not a fraud platform, and it should be judged as one.

The checkbox, revisited

The I’m not a robot checkbox works by watching the visitor, and whether it lets a person through depends on what it saw. HumanProof asks for something else: a confirmation on the person’s own device, with their fingerprint, face or PIN. The site receives proof that a person confirmed, and nothing about which person. That is a narrower claim than a score makes, but it is one we can stand behind. The site knows a person was here, we know a person proved somewhere, and neither of us knows who was here.

References


  1. Andrew Searles, Yoshimichi Nakatsuka, Ercan Ozturk, Andrew Paverd, Gene Tsudik and Ai Enkoji, “An Empirical Study & Evaluation of Modern CAPTCHAs”, 32nd USENIX Security Symposium, August 2023, §8 and Table 3. The human figures are the authors’ measurements; the solver figures are those reported in earlier attack papers. https://www.usenix.org/conference/usenixsecurity23/presentation/searles ↩︎

  2. Marti Motoyama, Kirill Levchenko, Chris Kanich, Damon McCoy, Geoffrey M. Voelker and Stefan Savage, “Re: CAPTCHAs — Understanding CAPTCHA-Solving Services in an Economic Context”, 19th USENIX Security Symposium, August 2010. https://www.usenix.org/legacy/event/sec10/tech/full_papers/Motoyama.pdf ↩︎

  3. Google Cloud, reCAPTCHA documentation, overview, accessed 14 October 2026. https://docs.cloud.google.com/recaptcha/docs ↩︎ ↩︎

  4. W3C Accessible Platform Architectures Working Group, “Inaccessibility of CAPTCHA: Alternatives to Visual Turing Tests on the Web”, Group Draft Note, 16 December 2021. https://www.w3.org/TR/turingtest/ ↩︎

  5. Cloudflare, “Turnstile” and “Server-side validation”, Cloudflare Developers documentation, accessed 14 October 2026. https://developers.cloudflare.com/turnstile/ and https://developers.cloudflare.com/turnstile/get-started/server-side-validation/ ↩︎

  6. ALTCHA, “How it works”, accessed 14 October 2026; the library is MIT licensed. https://altcha.org/docs/how-it-works/ ↩︎

  7. Martín Abadi, Mike Burrows, Mark Manasse and Ted Wobber, “Moderately Hard, Memory-Bound Functions”, Network and Distributed System Security Symposium, 2003. https://www.ndss-symposium.org/wp-content/uploads/2017/09/Moderately-Hard-Memory-Bound-Functions-Martin-Abadi.pdf ↩︎

  8. Friendly Captcha, “Proof-of-work”, accessed 14 October 2026. https://friendlycaptcha.com/docs/explanation/proof-of-work/ ↩︎

  9. Trustaige Research, “Every smartphone on sale can hold a passkey”. https://research.trustaige.com/notes/every-smartphone-can-hold-a-passkey ↩︎ ↩︎

  10. A. Davidson, J. Iyengar and C. A. Wood, “The Privacy Pass Architecture”, RFC 9576, June 2024. https://www.rfc-editor.org/rfc/rfc9576.html ↩︎

  11. S. Celi, A. Davidson, S. Valdez and C. A. Wood, “Privacy Pass Issuance Protocols”, RFC 9578, June 2024. https://www.rfc-editor.org/rfc/rfc9578.html ↩︎

  12. F. Denis, F. Jacobs and C. A. Wood, “RSA Blind Signatures”, RFC 9474, October 2023. https://www.rfc-editor.org/rfc/rfc9474.html ↩︎

  13. Thibault Meunier, “Humanity wastes about 500 years per day on CAPTCHAs. It’s time to end this madness”, Cloudflare blog, 13 May 2021. https://blog.cloudflare.com/introducing-cryptographic-attestation-of-personhood/ ↩︎

  14. Apple Developer, “Challenge: Private Access Tokens”, 9 June 2022. https://developer.apple.com/news/?id=huqjyh7k ↩︎

  15. Eiji Kitamura, “Determine the passkey provider with AAGUID”, web.dev, March 2024: “Passkeys on Android and Apple platforms don’t support attestation as of March 2024.” Apple supports attestation for managed Apple accounts in enterprise deployments. https://web.dev/articles/webauthn-aaguid ↩︎

passkeyscaptchaprivacy-passbot-defencefraudwebauthn