The KYC Problem Nobody Wants to Talk About
Know Your Customer regulations exist for good reason. Governments need to prevent money laundering, terrorist financing, sanctions evasion, and fraud. Platforms need to verify that users are who they claim to be. Nobody disputes the goal. The problem is the implementation.
Traditional KYC requires users to upload passport scans, driver's license photos, utility bills, bank statements, and selfies to third-party verification vendors. Those vendors process the documents, extract the data, and store copies — sometimes indefinitely. The platform itself often retains a second copy. The result is a sprawling network of databases containing the most sensitive identity documents on earth, each one a breach waiting to happen.
The track record speaks for itself. Equifax exposed 147 million Social Security numbers, names, and dates of birth in a single breach. Capital One lost 100 million credit applications including SSNs and bank account numbers. T-Mobile leaked 40 million records including driver's license numbers. KYC vendors like Jumio, Onfido, and Au10tix process hundreds of millions of identity documents annually. Each one stores copies. Each one is a target. The question is not whether the next KYC vendor will be breached. It is when, and how many passport scans will be in the dump.
The fundamental architectural flaw is this: to verify that someone is over 18, the platform collects and stores their full date of birth, passport photo, document number, and home address. To verify that someone lives in the United States, the platform stores their complete residential address, utility bill, and bank statement. To check sanctions lists, the platform stores the user's full legal name and date of birth alongside OFAC query logs. Every single one of these verification tasks collects far more data than the actual decision requires.
If the question is "Is this person over 18?" then the answer is YES or NO. You do not need their date of birth to answer that question. You need a proof that their date of birth satisfies the constraint — without revealing what the date of birth actually is. That is exactly what zero-knowledge proofs provide.
How Zero-Knowledge Proofs Work for KYC
A zero-knowledge proof allows one party (the prover) to convince another party (the verifier) that a statement is true without revealing any information beyond the truth of the statement itself. In the context of KYC, this means proving identity attributes without revealing the underlying identity documents.
Consider four concrete examples that cover the vast majority of KYC requirements:
1 Prove age ≥ 18 without revealing date of birth
current_date - dob ≥ 18 years without revealing the date itself. The verifier receives the commitment, the proof, and nothing else. The user's exact age, birth year, and birthday remain private.2 Prove country = US without revealing address
3 Prove income ≥ threshold without revealing amount
4 Prove NOT on sanctions list without revealing name
The STARK Circuit: Real Implementation
H33 ZK-KYC uses ZK-STARK proofs rather than SNARKs for three reasons: no trusted setup ceremony, transparent verification (anyone can validate), and post-quantum security (hash-based, no elliptic curve assumptions). The age verification circuit illustrates the approach:
// AgeVerificationCircuit — ZK-STARK with SHA3-256 commitments // Proves: age >= min_age without revealing date_of_birth struct AgeVerificationCircuit { // Private witness (known only to prover) dob_day: u8, dob_month: u8, dob_year: u16, salt: [u8; 32], // Random salt for commitment // Public inputs (visible to verifier) dob_commitment: [u8; 32], // SHA3-256(dob || salt) current_date: u32, // YYYYMMDD format min_age: u8, // Required minimum age } impl AgeVerificationCircuit { fn constraints(&self) { // 1. Verify commitment matches private DOB let computed = sha3_256(self.dob_year, self.dob_month, self.dob_day, self.salt); assert_eq!(computed, self.dob_commitment); // 2. Compute age from DOB and current date let age = compute_age(self.dob_year, self.dob_month, self.dob_day, self.current_date); // 3. Assert age constraint assert!(age >= self.min_age); // 4. Range checks (DOB is valid calendar date) assert!(self.dob_month >= 1 && self.dob_month <= 12); assert!(self.dob_day >= 1 && self.dob_day <= 31); assert!(self.dob_year >= 1900 && self.dob_year <= 2026); } }
The circuit enforces three things: the prover knows the preimage of the committed DOB hash, the DOB yields an age that meets the minimum requirement, and the DOB values are valid calendar dates. The verifier checks the proof in under 50 microseconds. At no point does the verifier learn the date of birth, the birth year, or even the decade.
Three-Tier Verification
Different regulatory contexts require different levels of identity assurance. H33 ZK-KYC offers three tiers, each building on the previous one. Platforms choose the tier that matches their compliance obligations.
1 Basic — Document Hash + ZK Age Proof
Includes: SHA3-256 document commitment (proves the user possesses a valid identity document without transmitting it), ZK-STARK age proof (proves age ≥ threshold), ZK-STARK jurisdiction proof (proves country of issuance). The platform receives three proofs and zero document data.
Use case: Age-gated platforms, basic sign-up verification, social media age verification mandates, content platforms subject to age verification laws.
Document commitment hash, STARK proof (age ≥ 18), STARK proof (jurisdiction), Dilithium-5 signature over all proofs. Zero PII.
2 Enhanced — + Biometric Liveness + ZK Address Proof
Adds: FHE-encrypted biometric liveness check (selfie template matched against document photo entirely on ciphertext — the server never sees either face), ZK-STARK address proof (proves residency in a required jurisdiction without revealing the street address, city, or ZIP code), and temporal binding (proof is timestamped and non-replayable).
Use case: Fintech onboarding, neobank account opening, cryptocurrency exchange registration, regulated marketplace sellers.
Everything from Basic, plus: FHE biometric match score (encrypted, decrypted only to YES/NO by the user's device), STARK proof (address jurisdiction), liveness confidence score, timestamp + nonce. Still zero PII.
3 Full — + OFAC/PEP Sanctions Screening + Compliance Report
Adds: Encrypted OFAC/SDN sanctions screening (user's name and DOB are FHE-encrypted before transmission; the screening engine runs the match against the full sanctions list on ciphertext), PEP (Politically Exposed Persons) database screening, adverse media check on encrypted identifiers, and a signed compliance report that satisfies BSA/AML record-keeping requirements.
Use case: Banking, money transmission, securities trading, lending, insurance, any entity with BSA/AML obligations.
Everything from Enhanced, plus: STARK proof (not on OFAC SDN list, version hash committed), STARK proof (not a PEP match), Dilithium-signed compliance report (timestamp, list versions, screening methodology hash, result). The platform can present this report to regulators. It proves the screening happened correctly without containing any user PII.
OFAC Screening on Encrypted Identifiers
Sanctions screening is the hardest problem in privacy-preserving KYC. Traditional screening requires sending the user's full legal name and date of birth to an OFAC screening provider, who runs a fuzzy match against the Specially Designated Nationals (SDN) list. Every screening provider stores query logs. Every query log is a record of who was screened, when, and what their name and DOB are.
H33 solves this with Fully Homomorphic Encryption. The user's device encrypts their name and DOB using BFV (Brainfuck Verifiable — just kidding, it is Brakerski/Fan-Vercauteren lattice-based FHE). The encrypted identifier is sent to the H33 screening engine. The engine performs fuzzy string matching, phonetic matching, and alias resolution entirely on the ciphertext. It never decrypts. The match result is an encrypted YES/NO that only the user's device can decrypt. If the result is NO (not on the list), the user's device generates a ZK-STARK proof attesting to the result and signs it with Dilithium-5.
The screening server never sees the name. The platform never sees the name. The only entity that ever possesses the plaintext identity is the user themselves, on their own device. If the screening server is breached, the attacker gets ciphertexts — lattice-based encryption that is secure against both classical and quantum computers.
Biometric Liveness via FHE
Enhanced and Full tier verifications include biometric liveness detection. The user takes a selfie, and their device extracts a 128-dimensional biometric template from it. The device also extracts a template from the photo on their identity document. Both templates are encrypted using BFV Fully Homomorphic Encryption before leaving the device.
The H33 biometric engine computes the inner product of the two encrypted templates — the same operation used for face matching — entirely on ciphertext. The encrypted similarity score is returned to the user's device, which decrypts it locally. If the score exceeds the liveness threshold (indicating the selfie matches the document photo and is a live capture, not a printed photo or screen replay), the device generates a ZK-STARK proof of the match and signs it.
The server processes biometric data without ever seeing a face. There is no biometric database to breach. There are no selfie images stored on any server. The BIPA, CCPA, and GDPR exposure that accompanies every traditional biometric KYC vendor is eliminated entirely.
What the Platform Actually Receives
This is the critical difference. After a Full tier ZK-KYC verification, the platform receives the following payload:
{
"verification_id": "zkkyc_7f3a9b2c...",
"tier": "full",
"result": true,
"confidence": 0.997,
"proofs": {
"age_gte_18": "STARK proof (verified)",
"jurisdiction_us": "STARK proof (verified)",
"biometric_live": "STARK proof (verified)",
"ofac_clear": "STARK proof (verified)",
"pep_clear": "STARK proof (verified)"
},
"sanctions_list_version": "SDN-2026-04-04-sha3-a8f2...",
"signature": "Dilithium-5 (ML-DSA-87)",
"timestamp": "2026-04-05T14:32:01Z",
"pii_fields_received": 0
}
No name. No date of birth. No address. No SSN. No passport number. No selfie. No document scan. The platform stores this payload for compliance records. If the platform is breached, the attacker gets cryptographic proofs that reveal nothing about the user's identity. There is nothing to steal.
Traditional KYC vs. H33 ZK-KYC
| Attribute | Traditional KYC | H33 ZK-KYC |
|---|---|---|
| Passport scan | Stored by vendor + platform | Never transmitted |
| SSN / National ID | Stored in database | Never transmitted |
| Home address | Stored in database | ZK jurisdiction proof only |
| Date of birth | Stored in database | ZK age proof only |
| Selfie / biometric | Stored by vendor | FHE-encrypted, never seen |
| OFAC screening | Name sent to screening vendor | FHE-encrypted match |
| Breach exposure | Full PII for all users | Zero PII — proofs only |
| BIPA / GDPR liability | Full biometric data liability | No biometric data stored |
| Post-quantum security | None (RSA/ECDSA) | STARK + Dilithium (ML-DSA) |
| Compliance proof | Vendor attestation letter | Cryptographic proof (verifiable) |
Who Needs This
Any platform that performs identity verification and does not want to become the next Equifax headline. Specifically:
Fintech platforms and neobanks — subject to BSA/AML, required to perform KYC on every account holder, and exposed to massive class-action liability when (not if) their KYC vendor is breached. ZK-KYC eliminates the PII storage requirement entirely while satisfying the same regulatory obligations.
Cryptocurrency exchanges — required by FinCEN to perform KYC, hated by their user base for collecting identity documents. ZK-KYC resolves the tension: the exchange meets its regulatory obligations, the user never surrenders their passport scan to a centralized database.
Lending platforms — need to verify income, identity, and address for underwriting. ZK range proofs verify income thresholds. ZK jurisdiction proofs verify residency. The lender makes the same credit decision with the same confidence, backed by cryptographic proofs instead of document copies.
Marketplaces — platforms like Airbnb, Uber, and eBay that verify seller and host identities. These platforms hold millions of identity documents and are prime targets. ZK-KYC reduces their liability surface to zero while maintaining trust and safety.
Age-gated platforms — as age verification mandates expand globally (EU Digital Services Act, UK Online Safety Act, US state-level laws), platforms need a way to verify age without building databases of children's and adults' identity documents. ZK age proofs are the only technically sound solution.
Pricing
H33 ZK-KYC is priced per verification, not per seat. Volume discounts apply at every tier. No minimums, no contracts required.
| Tier | Includes | 1-10K/mo | 10K-100K/mo | 100K-1M/mo | 1M+/mo |
|---|---|---|---|---|---|
| Basic | Doc hash + age proof + jurisdiction proof | $0.06 | $0.04 | $0.02 | $0.008 |
| Enhanced | + FHE biometric liveness + ZK address proof | $0.10 | $0.06 | $0.025 | $0.012 |
| Full | + OFAC/PEP screening + compliance report | $0.20 | $0.10 | $0.04 | $0.006 |
Compare this to traditional KYC vendors that charge $1 to $5 per verification and create ongoing breach liability that can exceed $100 per compromised record in class-action settlements. At 100,000 verifications per month on the Full tier, H33 ZK-KYC costs $4,000/month. A single breach of 100,000 passport scans at a traditional vendor can result in $10 million or more in settlements, regulatory fines, and remediation costs. The ROI calculation is not close.
Regulators do not require platforms to store identity documents. They require platforms to verify identity. A Dilithium-signed, STARK-proven compliance report that cryptographically attests to sanctions screening, age verification, and liveness detection satisfies the verification requirement without creating the storage liability. When an examiner asks "show me your KYC records," you show them a chain of unforgeable cryptographic proofs. That is stronger evidence than a folder full of passport JPEGs.
The Technical Stack
Every component in the ZK-KYC stack is post-quantum secure. STARK proofs are hash-based (SHA3-256) with no elliptic curve assumptions. BFV encryption is lattice-based. Dilithium (ML-DSA) signatures are NIST-standardized post-quantum. There is no component in the pipeline that a quantum computer can break. This is not a future-proofing claim — it is a present-tense architectural decision that eliminates harvest-now-decrypt-later risk for identity data that will remain sensitive for decades.
The entire verification pipeline — from document commitment through STARK proof generation through Dilithium signing — runs in under 2 seconds on a modern mobile device. Server-side proof verification takes less than 50 microseconds. At scale on H33 infrastructure, the system processes over 2 million verifications per second.
Get Started
H33 ZK-KYC is available now via API. Integration requires replacing your existing KYC vendor's SDK with the H33 client library. The API accepts verification requests and returns signed proof bundles. Average integration time is under one day for platforms with existing KYC flows.
Explore the ZK-KYC product page for technical documentation, SDK downloads, and integration guides. Review pricing for volume tier details and custom enterprise agreements. Or request a live demo — we will run a real verification against your test data so you can see the proof pipeline end to end. Your platform verifies identity. Your platform stores zero PII. That is not a tradeoff. That is the way KYC should have worked from the beginning.