Security
Don't trust our claims. Inspect the design.
A new identity system has to earn trust. Everything below is either enforced by code you can read or listed honestly as a risk we still carry.
What holds, and where in the code
-
Keys never leave the phone
A 256-bit seed is generated on the device and stays in the platform keychain or keystore, gated by the biometric. Everything else is derived from it. The index, the site, and we never see it.
-
Phishing fails by construction
The phone signs the site’s registered host into every approval, and the per-site key is derived from that host. A signature for a lookalike domain never verifies for the real one.
-
Nothing replays
Every challenge carries a nonce, is accepted once, and expires after 60 seconds. Signed requests from the phone carry a timestamp and are rejected if seen twice.
-
What you see is what gets signed
For a sensitive action the site’s server composes the text, the phone shows it, and its hash is inside the signature. An approval for one amount and payee is useless for another.
-
The index is safe to leak
It stores public keys, push tokens, rotating Bluetooth keys, per-site identifiers, revocation state, and an audit trail. Client and webhook secrets are stored as hashes. A full database breach yields nothing that can sign in as anyone.
-
Sites cannot match you
Each site receives its own identifier, a hash of a key derived for that site alone, and its own device id, derived the same way. The cross-site identifiers the index uses are never released, and there is no email in any token.
Each row of the threat model names the function that enforces it.
What we do not claim
The risks we still carry
- The index operator is trusted for routing
- The operator can send a challenge for any site to any device, and could mint a token for a site that does not verify the double-signed assertion. The person still has to approve on the phone with the match code shown. If that trust is unacceptable, run the index yourself; it is the same code.
- Hardware-isolated keys are planned, not shipped
- Keys sit behind the platform keychain or keystore and the device biometric. Secure Enclave and StrongBox wrapping is on the roadmap. Until it ships the app never claims a hardware-isolated key: the amr claim reports only what verified the person.
- No external audit yet
- The threat model is public and every line of code is open, but nobody outside the project has reviewed it. An independent review is planned before 1.0. Until then, read the code rather than our claims.
- The recovery phrase is the only recovery
- Lose the phone and the 24 words and the identity is gone. That is deliberate: nothing at Identizen can vouch for a person, so nothing at Identizen can be tricked into handing an identity over.
Verify it yourself
Everything is public
The specification, the vectors, the threat model, and the code are the security documentation. Marketing pages, including this one, are downstream of them.
- Threat model Assets, attackers, mitigations, residual risks, open items.
- Protocol specification Every format and every check, as implemented.
- Test vectors Known-answer vectors for signing, canonical encoding, and key derivation.
- Source code The index, the apps, the SDKs, and this site. Apache-2.0.
- Self-hosting Run the same index on your own Cloudflare account or in Docker.
Found something?
Report it privately. We acknowledge within two business days and publish a fix plan within ten for anything affecting the hosted index, the apps, or the protocol. Credit is yours if you want it.
/.well-known/security.txt · SECURITY.md · GitHub private advisories