Skip to main content
Didit Raises $7.5M to Build the Infrastructure for Identity and Fraud
Didit
Back to blog
Blog · March 7, 2026

Privacy-Preserving Proof of Address with Didit and ZKPs in Python

This blog explores how Zero-Knowledge Proofs (ZKPs) can revolutionize Proof of Address (PoA) verification by enhancing user privacy, particularly when integrated with robust platforms like Didit.

By DiditUpdated
privacy-preserving-proof-of-address-didit-zkps-python.png

Enhanced Privacy in PoAZero-Knowledge Proofs (ZKPs) allow individuals to verify their address information without revealing the underlying sensitive data, safeguarding personal privacy during Proof of Address (PoA) verification processes.

Technical Implementation with PythonDeveloping privacy-preserving PoA systems in Python involves leveraging ZKP libraries and careful cryptographic design to prove address attributes while keeping raw data confidential.

Challenges and SolutionsImplementing ZKPs for PoA requires addressing computational overhead, proof generation complexity, and integration with existing identity verification workflows, which can be streamlined with modular platforms.

Didit's Role in Modern PoADidit's Proof of Address solution, with its AI-powered extraction and comprehensive validation, can be seamlessly integrated with ZKP mechanisms, offering a secure, privacy-centric, and efficient address verification experience with Free Core KYC and no setup fees.

The Evolution of Proof of Address: Why Privacy Matters

Proof of Address (PoA) is a cornerstone of Know Your Customer (KYC) and Anti-Money Laundering (AML) compliance across various industries, from banking and fintech to online services and gambling. Traditionally, PoA involves submitting documents like utility bills or bank statements that explicitly display a user's name and full residential address. While effective for verification, this method often raises significant privacy concerns. Users are required to share highly sensitive personal information, which, if mishandled or breached, can lead to identity theft and other forms of fraud.

In an increasingly data-conscious world, the demand for privacy-preserving verification methods is growing. This is where Zero-Knowledge Proofs (ZKPs) offer a transformative solution. ZKPs allow one party (the prover) to prove to another party (the verifier) that a statement is true, without revealing any information beyond the validity of the statement itself. Imagine being able to prove you live at a specific address without showing your utility bill, or confirming your age without disclosing your date of birth. This paradigm shift can revolutionize how PoA is conducted, aligning it with modern privacy expectations and regulations like GDPR.

Didit, as an AI-native identity platform, understands the critical balance between security, compliance, and user privacy. Its existing Proof of Address capabilities, which include intelligent document capture, AI-powered data extraction, and comprehensive validation, lay the groundwork for integrating advanced privacy features like ZKPs. Didit's modular architecture means that such innovative solutions can be seamlessly plugged into existing verification workflows, enhancing both security and user experience.

Understanding Zero-Knowledge Proofs for Address Verification

At its core, a Zero-Knowledge Proof for address verification would enable a user to prove certain attributes about their address (e.g., 'I live in London,' or 'My address matches the one on my ID') without revealing the actual address document or even the full address. This is achieved through complex cryptographic protocols that generate a 'proof' based on the sensitive data. The verifier can then check this proof to confirm the statement's truthfulness, without ever seeing the data itself.

There are several types of ZKPs, such as zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) and zk-STARKs (Zero-Knowledge Scalable Transparent Argument of Knowledge), each with its own trade-offs in terms of proof size, generation time, and trust assumptions. For a privacy-preserving PoA system, the choice of ZKP system would depend on the specific requirements for scalability, computational resources, and the level of privacy desired.

Consider a scenario: a user needs to prove their address for an online service. Instead of uploading a bank statement, they could use a ZKP system. The system would take their bank statement, generate a cryptographic proof that contains only the necessary address attributes (e.g., 'The document shows an address in New York, and the name on the document matches the verified name'), and then send only this proof to the service. The service verifies the proof's validity, confirms the address attribute, and grants access, all without ever seeing the bank statement itself.

Didit's Proof of Address solution already performs sophisticated checks like document authenticity, tamper detection, address standardization, and geocoding. Integrating ZKPs would add another layer of privacy, ensuring that even these extracted attributes are only revealed when absolutely necessary, or in a generalized form that protects the user's exact location. This aligns perfectly with Didit's mission to automate trust while prioritizing user data protection.

Implementing Privacy-Preserving PoA in Python

Building a proof-of-concept for privacy-preserving Proof of Address using Python and ZKPs involves several steps. While a full production-ready system is complex, a simplified example can illustrate the core principles. We would typically use a ZKP library like snarkjs (often via a Python wrapper) or custom implementations of simpler ZKP schemes for educational purposes.

1. Data Preparation: The first step is to digitize and structure the address data from a document. Didit's Proof of Address excels here, using high-precision OCR to extract information like street, city, region, postal code, issuer, and issue date from various document types (utility bills, bank statements, government-issued documents).

2. Defining the Statement: Next, we define the "statement" we want to prove. For example, "The city extracted from the document is 'London'" or "The issue date of the document is within the last 90 days."

3. Circuit Design: In ZKP systems, the statement is encoded into a mathematical circuit. This circuit defines the computations that need to be performed on the private inputs (the actual address data) to produce a public output (the statement being proven). For example, a circuit might check if a string matches a specific city name or if a date falls within a range.

4. Proof Generation: The user (prover) inputs their private address data and the circuit into a ZKP prover algorithm. This algorithm generates a proof, which is a small piece of cryptographic data.

5. Proof Verification: The service (verifier) takes the public statement and the generated proof. It runs a ZKP verifier algorithm, which checks the proof against the public statement. If the proof is valid, the verifier knows the statement is true, without ever seeing the private address data.

Here's a conceptual Python snippet (simplified, as actual ZKP libraries are more involved):


# Conceptual ZKP Proof of Address in Python

from some_zkp_library import generate_proof, verify_proof

def prove_address_in_city(private_address_data, target_city):
    # Simulate Didit's OCR and extraction
    extracted_city = private_address_data['city']

    # Define the statement to prove
    statement = f"The extracted city is {target_city}"

    # In a real ZKP, this would involve circuit compilation and witness generation
    # For simplicity, we'll simulate proof generation
    is_true = (extracted_city == target_city)

    if is_true:
        # Generate a cryptographic proof without revealing 'extracted_city'
        proof = generate_proof(private_address_data, statement)
        return proof, statement
    else:
        return None, statement

def verify_address_proof(proof, statement):
    # Verify the proof cryptographically
    is_valid = verify_proof(proof, statement)
    return is_valid

# --- Example Usage ---
user_data = {
    'name': 'John Doe',
    'street': '123 Main St',
    'city': 'New York',
    'region': 'NY',
    'postal_code': '10001',
    'document_type': 'BANK_STATEMENT',
    'issue_date': '2024-01-15'
}

# User wants to prove they live in 'New York' without revealing full address
proof, statement_to_verify = prove_address_in_city(user_data, 'New York')

if proof:
    print(f"Prover generated a proof for statement: '{statement_to_verify}'")
    # Verifier receives proof and statement
    is_verified = verify_address_proof(proof, statement_to_verify)

    if is_verified:
        print("Proof successfully verified! User lives in New York.")
    else:
        print("Proof verification failed.")
else:
    print(f"Could not generate proof for statement: '{statement_to_verify}' - statement is false.")

This conceptual example highlights how Didit's robust data extraction from Proof of Address documents could feed into a ZKP system. The complexity lies in efficiently creating these circuits and proofs for real-world scenarios, where attributes like name matching, date validation, and document authenticity (which Didit's system already handles) need to be proven without direct disclosure. Didit's API-first approach and structured identity data make it a powerful backend for such privacy-enhanced solutions.

Challenges and the Future of Privacy-Preserving KYC

While the promise of ZKPs for privacy-preserving PoA is immense, several challenges need to be addressed for widespread adoption. These include the computational cost of generating ZKPs, which can be significant, especially for complex statements. The learning curve for designing ZKP circuits is also steep, requiring specialized cryptographic knowledge. Furthermore, integrating ZKP systems with existing identity verification infrastructure requires careful planning and execution.

However, advancements in ZKP technology are rapidly making them more efficient and accessible. Libraries are maturing, and hardware acceleration for ZKP computation is on the horizon. The benefits of enhanced privacy, reduced data exposure, and improved compliance are strong motivators for overcoming these hurdles.

The future of KYC, especially for Proof of Address, is likely to involve a hybrid approach where traditional robust verification methods are augmented with privacy-enhancing technologies like ZKPs. This allows businesses to meet regulatory obligations while building greater trust with their users by respecting their privacy. Didit's commitment to an open, modular identity layer positions it perfectly to lead this evolution. Its AI-native solutions, including ID Verification, Passive & Active Liveness, 1:1 Face Match, AML Screening & Monitoring, and of course, Proof of Address, provide the foundational building blocks. By offering Free Core KYC and a developer-first approach, Didit empowers businesses to experiment with and implement cutting-edge privacy solutions without prohibitive upfront costs.

How Didit Helps

Didit is uniquely positioned to facilitate the integration of privacy-preserving technologies like Zero-Knowledge Proofs into Proof of Address verification workflows. Our AI-native platform offers a comprehensive Proof of Address solution that extracts, validates, and standardizes address information from a wide array of documents, including utility bills, bank statements, and government-issued documents. This robust data extraction is the crucial first step for any ZKP implementation, providing the structured inputs required to generate proofs.

Didit's modular architecture means that developers can leverage our powerful APIs to capture and process documents, and then integrate a ZKP layer on top to prove specific attributes without exposing the raw data. Our system performs intelligent document classification, name matching with identity documents, issue date extraction and validation, and comprehensive checks for document authenticity and tamper detection. These capabilities ensure that the underlying data, before being used in a ZKP, is already highly reliable and secure. The verification report generated by Didit's Proof of Address provides detailed insights, including the overall status, document details, extracted address data, and any warnings, which can inform the design of ZKP circuits.

Furthermore, Didit's commitment to a developer-first experience, with an instant sandbox and clean APIs, empowers teams to innovate. Businesses can integrate Didit's Proof of Address for initial data ingestion and validation, then use the verified attributes to create ZKP-based proofs for privacy-sensitive use cases. This approach allows organizations to benefit from Didit's industry-leading accuracy and fraud prevention while progressively enhancing privacy. With Free Core KYC and no setup fees, Didit makes adopting advanced identity solutions, including those with future ZKP integrations, both accessible and cost-effective.

Ready to Get Started?

Ready to see Didit in action? Get a free demo today.

Start verifying identities for free with Didit's free tier.

Infrastructure for identity and fraud.

One API for KYC, KYB, Transaction Monitoring, and Wallet Screening. Integrate in 5 minutes.

Ask an AI to summarise this page
Privacy-Preserving Proof of Address with ZKPs and Didit.