Somewhere right now, a botnet operator is feeding a list of 10 million email/password pairs into an automated tool. The tool rotates through a pool of 50,000 residential proxy IPs, solves CAPTCHAs at $2 per thousand, and mimics human browser behavior with randomized delays and realistic User-Agent strings. At a success rate of 0.5%, the operator will compromise 50,000 accounts by morning. Total cost: less than $100.
This is credential stuffing—the automated, large-scale injection of stolen username/password pairs into login endpoints. It is not a sophisticated attack. It does not require zero-day exploits, social engineering, or any technical ingenuity. It requires only two things: a list of stolen credentials and cheap automation. Both are available to anyone with a web browser and a cryptocurrency wallet.
And it works. It works because 65% of people reuse the same password across multiple services. It works because the attack economics are overwhelmingly favorable to the attacker. It works because most defenses assume the attacker will behave like a bot, when modern tooling is designed specifically to behave like a human.
Credential stuffing is not a brute-force attack. The attacker is not guessing passwords. They are using real, validated credentials stolen from other breaches. Every username/password pair in a combo list was once a legitimate login. This makes the attack fundamentally different from brute force—and fundamentally harder to detect, because each individual request looks like a normal authentication attempt.
The Scale of the Problem
The credential stuffing economy is built on a foundation of breach data so massive it defies easy comprehension. Understanding the scale is essential to understanding why naive defenses fail.
The Dark Web Credential Market
As of 2025, Digital Shadows (now part of ReliaQuest) estimated that over 24 billion username/password pairs are available on the dark web and criminal marketplaces. That is roughly three credentials for every person on Earth. The number grows with every new breach.
The supply chain is mature and industrialized:
- Data breach operators steal raw databases from compromised services (hashed or plaintext passwords)
- Cracking teams use GPU clusters to reverse password hashes (bcrypt, SHA-256, MD5) into plaintext. Modern GPU rigs crack billions of MD5 hashes per second
- Combo list aggregators compile, deduplicate, and package credential pairs by target service, geography, or freshness
- Marketplaces sell curated lists: "1M Netflix-valid combos" or "500K banking-fresh pairs" for $10–$200
- Credential checking services offer API-based validation—upload a list, get back which ones still work, priced per valid hit
The economics are staggering. A "raw" combo list of 1 million unverified email/password pairs sells for $10–$50. A list of verified, currently-working credentials for a specific high-value target (banking, streaming, e-commerce) sells for $2–$30 per account. The margin between input cost and output value is what drives the entire industry.
Credential Stuffing Economics
Attacker Cost
- Combo list: $10–50 per 1M pairs
- Proxy pool: $50–200/month (residential)
- CAPTCHA solving: $2–6 per 1,000 solves
- Tooling: Free (OpenBullet, SentryMBA, custom)
- Total per 1M attempts: ~$50–300
Attacker Revenue
- Success rate: 0.1%–2%
- Compromised accounts: 1,000–20,000
- Per account value: $2–30 (resale)
- Direct fraud: $50–500+ per account
- Total per 1M attempts: $5,000–200,000+
That is a 100x to 1,000x return on investment. No legitimate business achieves those margins. This is why credential stuffing is not going away—the economics are simply too favorable for the attacker.
How Credential Stuffing Works
A credential stuffing attack follows a predictable pipeline. Understanding each stage reveals why single-layer defenses fail.
Stage 1: Combo List Acquisition
The attacker acquires a credential list from a dark web marketplace, a Telegram channel, a paste site, or a private breach forum. Lists are categorized by source service, date of breach, hash type, and whether the passwords have been cracked to plaintext. Premium lists are pre-validated: someone has already tested each pair against the target service and confirmed it works as of a specific date.
Stage 2: Proxy Infrastructure
To avoid IP-based rate limiting, the attacker routes requests through a proxy network. Modern proxy services offer:
- Residential proxies: Real household IP addresses (from infected IoT devices or paid proxy apps) that are indistinguishable from legitimate users. Pools of 10M+ IPs available
- Mobile proxies: Cellular network IPs that rotate with each connection, shared by thousands of legitimate mobile users
- Datacenter proxies: Cheaper but easier to detect—often used for initial testing
- ISP proxies: Static residential IPs that combine the legitimacy of residential with the speed of datacenter
A well-funded attacker using residential proxies can distribute 1 million login attempts across 50,000+ unique IP addresses. Each IP sends only 20 requests—well below any reasonable rate limit threshold.
Stage 3: CAPTCHA Bypass
CAPTCHAs have not been a meaningful defense against credential stuffing for years. The bypass ecosystem is mature:
- Human CAPTCHA farms: Services like 2Captcha and Anti-Captcha employ workers who solve CAPTCHAs manually at $2–6 per 1,000. Average solve time: 10–30 seconds
- AI-based solvers: Machine learning models that solve reCAPTCHA v2 image challenges with 90%+ accuracy in under 5 seconds
- Token harvesting: For reCAPTCHA v3 (invisible), services generate valid tokens on pre-warmed browser profiles and sell them to attackers. The token is valid for 2 minutes—plenty of time to attach it to a stuffing request
- Browser automation: Puppeteer/Playwright with stealth plugins that maintain full browser state, making CAPTCHA challenges less likely to trigger
Stage 4: Automated Login Testing
The attacker uses purpose-built tools to submit credentials at scale. The most common tools:
| Tool | Type | Capability | Detection Difficulty |
|---|---|---|---|
| OpenBullet 2 | Open source | Custom configs per target, proxy rotation, CAPTCHA integration | Medium |
| SentryMBA | Commercial | GUI-based, pre-built configs for 1,000+ sites | Medium |
| Custom scripts | Bespoke | Headless browsers, full TLS fingerprint spoofing | Hard |
| Puppeteer + stealth | Open source | Full browser context, human-like mouse/keyboard simulation | Very Hard |
| Residential botnet | Criminal | Requests originate from real devices on real networks | Extremely Hard |
Modern tooling doesn't just send HTTP requests. It maintains full browser sessions with consistent TLS fingerprints, realistic timing jitter, mouse movement simulation, and proper cookie handling. From the server's perspective, a well-configured Puppeteer request is indistinguishable from a real user opening Chrome.
Stage 5: Account Monetization
Compromised accounts are monetized through multiple channels: resale on account marketplaces, direct financial fraud (stored payment methods), cryptocurrency theft, gift card draining, loyalty point theft, or use as infrastructure for further attacks (spam, phishing, money laundering). A single compromised financial account can yield hundreds of dollars in fraud before the victim notices.
Major Breaches From Credential Stuffing
Credential stuffing has caused some of the most high-profile security incidents of the past five years. These are not theoretical scenarios—they are documented breaches that affected millions of real users.
| Incident | Year | Accounts Affected | Impact |
|---|---|---|---|
| Disney+ | 2019 | Thousands | Accounts appeared on dark web within hours of service launch. Hijacked users locked out; accounts resold for $3–11 each |
| Zoom | 2020 | 500,000+ | Credentials sold on dark web for under $0.01 each. Attackers gained access to meeting links, recordings, and personal rooms |
| 23andMe | 2023 | 6.9 million | Attackers used stuffed accounts to scrape DNA Relatives data, exfiltrating genetic ancestry information on millions. Company filed for bankruptcy in part due to breach fallout |
| Norton LifeLock | 2023 | 925,000 | Ironic breach of a security product. Attackers accessed password vaults of Norton Password Manager users—potentially exposing every password the victim had stored |
| Roku | 2024 | 576,000 | Two separate credential stuffing campaigns. Attackers used compromised accounts to make fraudulent purchases via stored payment methods |
| PayPal | 2023 | 35,000 | Attackers accessed names, addresses, SSNs, tax IDs, and transaction histories. Direct financial exposure |
23andMe is particularly instructive. The attackers did not breach 6.9 million accounts directly. They stuffed credentials against roughly 14,000 accounts, then exploited the DNA Relatives feature to scrape genetic data on connected users. A single compromised account could expose hundreds of relatives. The initial stuffing attack was small; the cascading data exposure was catastrophic. This demonstrates that credential stuffing risk is not limited to the compromised accounts themselves—it extends to every user connected to those accounts through social features, shared data, or linked profiles.
Detection Techniques
Detecting credential stuffing is fundamentally harder than detecting brute force, because each individual request may look entirely legitimate. The attacker is sending a valid username with a password that was once correct. Detection must rely on aggregate patterns and behavioral signals rather than individual request analysis.
Velocity Limits and Rate Limiting
The most basic detection: monitor login attempt rates and throttle when thresholds are exceeded. But naive rate limiting has severe limitations against modern attacks:
# Naive rate limiting — necessary but insufficient from redis import Redis from datetime import timedelta redis = Redis() def check_rate_limit(identifier: str, window: int = 300, max_attempts: int = 5) -> bool: """ Multi-dimension rate limiting: - Per IP: 5 failed attempts per 5 minutes - Per username: 10 failed attempts per 15 minutes - Per IP subnet (/24): 50 failed attempts per 10 minutes - Global: 1000 failed attempts per minute triggers alert """ key = f"login_attempts:{identifier}" current = redis.incr(key) if current == 1: redis.expire(key, window) return current <= max_attempts def enforce_login_limits(ip: str, username: str, subnet: str): checks = [ check_rate_limit(f"ip:{ip}", window=300, max_attempts=5), check_rate_limit(f"user:{username}", window=900, max_attempts=10), check_rate_limit(f"subnet:{subnet}", window=600, max_attempts=50), ] if not all(checks): raise RateLimitExceeded("Too many login attempts")
The problem: an attacker with 50,000 residential proxy IPs can send 5 requests per IP and stay under the per-IP limit while still testing 250,000 credentials. Per-username limiting helps more but creates a denial-of-service vector—an attacker can intentionally lock out legitimate users by failing 10 logins against their username.
Device Fingerprinting
Collecting browser and device characteristics to identify automation. Effective signals include:
- TLS fingerprinting (JA3/JA4): The cipher suite order, extensions, and elliptic curves offered during the TLS handshake create a fingerprint unique to each HTTP client. A Python script pretending to be Chrome has a different JA3 hash than actual Chrome
- HTTP/2 fingerprinting (Akamai fingerprint): Settings frame parameters, header order, and stream priorities differ between real browsers and HTTP libraries
- Canvas/WebGL fingerprinting: Rendering differences between GPU drivers create unique hashes
- Navigator API inconsistencies: Headless Chrome reports different values for
navigator.webdriver,navigator.plugins, andnavigator.languagesthan real Chrome - Font enumeration: Installed font lists vary by OS, locale, and installed software
Limitation: Puppeteer with stealth plugins patches most of these signals. The arms race between fingerprinters and fingerprint spoofers is ongoing, with spoofers generally winning on a 3–6 month lag.
Behavioral Analysis
Analyzing user interaction patterns to distinguish humans from bots. The most effective signals:
- Mouse movement: Humans exhibit curved, imprecise mouse paths with micro-corrections. Bots either don't move the mouse at all or generate unnaturally smooth/linear paths
- Keystroke dynamics: Human typing has variable inter-key timing that follows a personal cadence. Pasting a password from a database produces a characteristic zero-delay pattern
- Session duration: A legitimate user navigates to the login page, pauses, types credentials, and submits. A bot hits the login endpoint directly with near-zero page dwell time
- Referrer chain: Legitimate logins follow a natural navigation path (homepage, then login page, then submit). Bots often POST directly to the login endpoint with no preceding page loads
- Failed login distribution: Credential stuffing produces a distinctive pattern: many different usernames failing from the same IP or session, vs. legitimate users who retry the same username with different passwords
IP Reputation
Maintaining a reputation database of IP addresses based on their historical behavior. Effective data sources:
- Known proxy/VPN/Tor exit nodes: Frequently used by attackers. High false-positive rate (many legitimate users also use VPNs)
- Known botnet IPs: Published by threat intelligence feeds (Spamhaus, AbuseIPDB, Crowdsec)
- ASN reputation: Certain hosting providers and ASNs are disproportionately associated with malicious traffic
- Geolocation anomalies: A user who authenticated from New York 5 minutes ago is unlikely to be legitimately logging in from Singapore
- Residential vs. datacenter classification: Datacenter IPs attempting login are more suspicious than residential IPs
# Composite bot detection scoring def compute_risk_score(request) -> float: """ Returns 0.0 (legitimate) to 1.0 (definitely bot). Threshold for blocking: 0.7 Threshold for CAPTCHA challenge: 0.4 """ score = 0.0 # TLS fingerprint mismatch if request.ja4 not in KNOWN_BROWSER_JA4S: score += 0.3 # IP reputation ip_rep = get_ip_reputation(request.ip) if ip_rep.is_datacenter: score += 0.2 if ip_rep.abuse_score > 0.5: score += 0.15 # Behavioral signals if request.page_dwell_time_ms < 500: score += 0.2 # No human types that fast if not request.has_mouse_movement: score += 0.15 if request.keystroke_variance < 5: # ms score += 0.2 # Pasted password # Credential pattern (aggregate) recent_failures = get_recent_failures(request.ip, window=600) unique_usernames = len(set(f.username for f in recent_failures)) if unique_usernames > 3: score += 0.3 # Multiple usernames from one IP = stuffing return min(score, 1.0)
Defense Layers: A Comprehensive Framework
No single defense stops credential stuffing. Effective protection requires layered controls where each layer catches what the previous one misses. Here is a complete defense matrix ordered by implementation complexity and effectiveness:
| Layer | Control | Stops | Bypassed By | Effectiveness |
|---|---|---|---|---|
| L1 | WAF / IP Blocklists | Known-bad IPs, datacenter proxies, Tor exits | Residential proxies, mobile IPs | 20–30% |
| L2 | Rate Limiting | High-volume single-source attacks | Distributed attacks across 50K+ IPs | 30–40% |
| L3 | CAPTCHA | Basic automation, script-based attacks | CAPTCHA farms, AI solvers, token harvesting | 40–50% |
| L4 | Bot Detection (behavioral + fingerprint) | Most automation, headless browsers | Puppeteer+stealth, residential botnets | 60–75% |
| L5 | Breached Credential Detection | Known-compromised password pairs | Fresh breaches not yet in databases | 70–80% |
| L6 | MFA (TOTP / SMS) | Most credential stuffing (attacker has password but not 2nd factor) | MFA fatigue, real-time phishing proxies, SIM swap | 85–95% |
| L7 | Passwordless / FHE Biometric | All credential stuffing (no password exists to stuff) | Nothing (attack vector eliminated) | 100% |
The critical insight from this table: layers 1 through 5 are all partial defenses that reduce the success rate but never eliminate the attack. Even sophisticated bot detection with behavioral analysis can be bypassed by a well-funded attacker using residential botnets and human-operated browsers. MFA brings the success rate down dramatically but has its own failure modes. Only passwordless authentication—eliminating the password entirely—removes the attack vector.
Why MFA Helps But Isn't Enough
Multi-factor authentication is the most commonly recommended defense against credential stuffing, and it is genuinely effective. An attacker who obtains a valid username/password pair still cannot authenticate without the second factor. For most attackers, this is sufficient to move on to an easier target.
But MFA is not the end of the story. A growing set of techniques can bypass MFA in practice:
MFA Fatigue (Push Bombing)
For push-notification-based MFA (Microsoft Authenticator, Duo, Okta Verify), the attacker repeatedly triggers authentication prompts to the victim's phone. After being woken up at 3 AM by the 15th consecutive push notification, many users will tap "Approve" just to make it stop. This is not theoretical—it was the exact technique used in the 2022 Uber breach, where an attacker compromised an employee's account after bombarding them with MFA prompts for over an hour.
Real-Time Phishing Proxies (AiTM)
Tools like Evilginx2 and Modlishka act as transparent reverse proxies between the victim and the real login page. The victim sees the legitimate site (proxied through the attacker's domain), enters their credentials AND their MFA code, and the attacker captures both in real time. The session token is then replayed to the real service. This defeats all time-based MFA including TOTP, SMS, and push notifications.
Adversary-in-the-middle phishing kits are no longer advanced techniques reserved for nation-states. Services like Tycoon 2FA, Greatness, and DadSec/Phoenix sell phishing-as-a-service platforms that automate real-time MFA relay for $200–400/month. Microsoft reported a 146% increase in AiTM phishing attacks in 2023. When combined with credential stuffing (to identify which credentials are valid before launching targeted AiTM phishing), the attack chain is devastatingly effective.
SIM Swapping
For SMS-based MFA, the attacker socially engineers the victim's mobile carrier to transfer their phone number to a new SIM card. The attacker then receives the SMS verification code directly. The FCC reported that SIM swap complaints tripled between 2018 and 2023, with losses exceeding $68 million in 2023 alone.
MFA Adoption Gap
Perhaps the most practical problem with MFA as a credential stuffing defense: most users don't enable it. Google reported in 2023 that fewer than 30% of Gmail users had MFA enabled. Twitter (X) reported that only 2.6% of active users used any form of MFA. If your defense strategy relies on users opting into MFA, you are leaving 70–97% of your user base unprotected.
Passwordless as the Definitive Solution
The fundamental vulnerability that credential stuffing exploits is the existence of a shared secret—a password—that can be stolen, reused, and replayed. Every defense layer described above is an attempt to mitigate the consequences of this architectural flaw. The only way to eliminate credential stuffing entirely is to eliminate the password.
Passwordless authentication removes the shared secret from the equation. There are several approaches:
FIDO2 / WebAuthn
Asymmetric key pair bound to the device. Private key never leaves the authenticator. Phishing-resistant by design (origin-bound). Widely supported in browsers and OS platforms.
Passkeys
FIDO2 credentials synced across devices via cloud keychain (iCloud, Google Password Manager). Combines passwordless security with the usability of password managers. Adoption accelerating rapidly.
Magic Links
One-time login link sent via email. No stored credential to stuff. Weaker than FIDO2 (email account is a single point of failure) but eliminates password reuse entirely.
FHE Biometric Auth
Biometric matching performed entirely on encrypted data. No password, no shared secret, no plaintext biometric template. The strongest passwordless architecture—even if the server is breached, no usable data is exposed.
All of these approaches share one property: there is no credential to stuff. An attacker with a combo list of 10 billion email/password pairs has zero usable ammunition against a passwordless system. The entire attack chain collapses at step one.
FHE Biometric Auth: Even If Templates Leak, Nothing Is Exposed
Passwordless systems based on FIDO2/passkeys are excellent, but they still face one challenge: device loss and account recovery. If a user loses all their devices, the recovery process often falls back to less secure methods (email, SMS, knowledge-based questions), re-introducing attackable surfaces.
Biometric authentication solves the recovery problem—your fingerprint or face is always with you. But biometric systems introduce their own critical risk: biometric templates are irrevocable. Unlike passwords, you cannot rotate your fingerprints. If a biometric template database is breached, that data is compromised forever.
This is the exact problem that Fully Homomorphic Encryption (FHE) solves. With FHE biometric authentication, the biometric template is encrypted at enrollment and never decrypted at any point in the authentication pipeline. Matching is performed entirely on ciphertext.
// H33 FHE biometric authentication pipeline // Plaintext template NEVER exists on the server // Step 1: Client encrypts biometric probe locally let probe_vector = extract_biometric_features(&face_image); // 128-dim let encrypted_probe = bfv_encrypt_batch(&probe_vector, &public_key); // Step 2: Server loads encrypted enrolled template // This was encrypted at enrollment — server has NEVER seen plaintext let enrolled_ct = load_encrypted_template(user_id); // Step 3: FHE inner product (cosine similarity on ciphertext) // BFV lattice-based encryption — quantum-resistant by construction let encrypted_score = fhe_inner_product(&encrypted_probe, &enrolled_ct); // Step 4: Threshold check + ZKP attestation let proof = stark_lookup_proof(&encrypted_score, threshold); let attestation = dilithium_sign(&proof, &authority_sk); // Total pipeline: ~50µs per authentication at 1.2M auth/sec // Attacker who breaches the database gets: BFV ciphertext // — not invertible without secret key // — quantum-resistant (lattice-based, not RSA/ECC) // — useless for replay (fresh encryption each auth)
The security model is fundamentally different from any other authentication architecture:
- No password to stuff: The authentication factor is a biometric, not a shared secret
- No template to steal: The enrolled template is BFV ciphertext. An attacker who exfiltrates the entire database gets encrypted data that cannot be decrypted without the secret key
- No replay attack: Each authentication uses a fresh encryption of the biometric probe with randomized noise. Even if an attacker captures an encrypted probe, it cannot be reused
- Quantum-resistant by construction: BFV encryption is lattice-based (not vulnerable to Shor's algorithm). The ZKP uses SHA3-256 (quantum-safe). The attestation uses Dilithium/ML-DSA (FIPS 204). Every component in the pipeline is post-quantum secure
Traditional biometric systems decrypt the template on the server to perform matching, creating a window where plaintext biometric data exists in memory. FHE eliminates this window entirely. The computation happens on ciphertext. The server is cryptographically prevented from seeing the biometric data it is processing. This is not a policy control—it is a mathematical guarantee.
Cost Analysis: Prevention vs. Breach Remediation
Security investments are ultimately business decisions. The question is not whether credential stuffing defense is important, but whether the cost of prevention is justified by the cost of breach. The math is unambiguous:
| Cost Category | Prevention (Annual) | Breach Remediation |
|---|---|---|
| Bot detection service | $50K–$300K | — |
| WAF with credential stuffing rules | $20K–$100K | — |
| MFA infrastructure | $2–5/user/year | — |
| Passwordless/FHE auth | $0.001–0.01/auth | — |
| Incident response | — | $500K–$5M |
| Customer notification & credit monitoring | — | $50–200/user |
| Regulatory fines (GDPR, CCPA) | — | $100K–$20M+ |
| Litigation and settlement | — | $1M–$100M+ |
| Brand damage & customer churn | — | Unquantifiable |
IBM's 2025 Cost of a Data Breach Report puts the average credential-based breach cost at $4.81 million. For large enterprises with millions of users, costs can exceed $100 million when including litigation, regulatory fines, and lost business. 23andMe's credential stuffing breach contributed directly to the company's bankruptcy filing—the ultimate cost.
Compare this to the cost of prevention. A comprehensive defense stack (WAF + bot detection + breached credential screening + MFA + passwordless option) costs $200K–$500K annually for a mid-size enterprise. That is 4–10% of the cost of a single breach. The ROI on prevention is not debatable.
H33's Approach: Sub-Millisecond Auth Enables Real-Time Behavioral Checks
Most authentication systems face a latency tradeoff: adding behavioral checks, bot detection, and risk scoring adds processing time to every login. When your base authentication takes 200–500ms (typical for bcrypt password verification + database lookup + session creation), adding 100ms of bot detection scoring means a 20–50% latency increase. This creates pressure to cut corners on detection in the name of user experience.
H33's architecture eliminates this tradeoff. With a base authentication latency of ~50 microseconds (0.05ms), there is an enormous latency budget available for additional security checks without any perceptible impact on user experience.
Latency Budget Comparison
At 1.2 million authentications per second on a single Graviton4 instance, H33 can run full behavioral analysis, risk scoring, and anomaly detection on every single authentication attempt without any latency impact. There is no pressure to skip checks, reduce detection fidelity, or batch analysis asynchronously. Every login gets the full security stack in real time.
This throughput also makes credential stuffing attacks economically pointless even if an attacker could somehow generate valid biometric probes (they can't—FHE encryption prevents replay). The system can process and reject 1.2 million fraudulent attempts per second per node, making volumetric attacks meaningless.
The Complete Defense Stack in One API Call
H33 combines every layer of credential stuffing defense into a single API endpoint:
| Component | Latency | What It Stops |
|---|---|---|
| FHE biometric match (BFV) | ~43µs | All credential stuffing (no password to stuff) |
| STARK ZKP lookup | ~0.07µs | Template manipulation, proof forgery |
| Dilithium attestation | ~7.5µs | Replay attacks, token forgery (post-quantum signatures) |
| Total per auth | ~50µs | Credential stuffing + replay + forgery + quantum threat |
No password database to breach. No credential pairs to trade on the dark web. No MFA codes to intercept. No session tokens to harvest. The entire credential stuffing attack chain is architecturally impossible.
Implementation Recommendations
For organizations that cannot immediately adopt passwordless authentication, the following layered defense provides the strongest protection achievable with password-based systems:
- Deploy breached credential screening immediately. Use HIBP (Have I Been Pwned) or equivalent services to check passwords at registration and login. Block any credential that appears in known breach databases. This single control eliminates a large percentage of credential stuffing attempts because the attacker's combo list consists entirely of breached credentials
- Implement multi-dimensional rate limiting. Rate limit by IP, by username, by IP subnet, and by ASN. Use sliding windows, not fixed windows. Implement progressive delays (exponential backoff) rather than hard blocks to avoid creating denial-of-service vectors
- Add behavioral signals to your login flow. Collect client-side telemetry (mouse movement, keystroke timing, page dwell time) and use it as an input to risk scoring. This data is cheap to collect and provides high-signal differentiation between humans and bots
- Require MFA for all users, not just opt-in. The biggest weakness of MFA as a defense is adoption. If MFA is optional, 70–97% of your users remain unprotected. Make it mandatory. Use FIDO2/passkeys as the primary option with TOTP as fallback
- Plan your passwordless migration. Passwords are a liability. Every day you maintain a password database is a day that database can be breached. Set a timeline for offering passkeys, magic links, or biometric authentication as the primary login method. Make passwords the fallback, not the default
If you do only one thing after reading this article, implement breached credential screening. It is the highest-ROI single control against credential stuffing: low implementation cost, no user experience impact, and it directly invalidates the attacker's primary asset (the combo list). NIST SP 800-63B explicitly recommends checking passwords against breach databases.
The Bottom Line
Credential stuffing is not a sophisticated attack. It is a simple, automated, economically rational exploitation of the fundamental weakness in password-based authentication: the fact that humans reuse passwords, and that breached credentials are cheap and abundant. With over 24 billion stolen credentials in circulation and attack tooling available for free, the question is not whether your users' passwords have been compromised—it is how many of them have been compromised.
Traditional defenses—rate limiting, CAPTCHAs, WAFs—provide partial mitigation but cannot eliminate the attack. MFA dramatically reduces success rates but faces its own bypass techniques (fatigue attacks, AiTM phishing, SIM swaps) and suffers from chronically low adoption rates. Every defense that attempts to protect the password is working around the core problem rather than solving it.
The only definitive solution is to eliminate the password. Passwordless authentication—whether through FIDO2 passkeys, magic links, or FHE biometric matching—removes the credential that the attacker needs. No password means no credential to stuff, no combo list to exploit, no reuse vulnerability to abuse.
FHE biometric authentication goes one step further: even if the authentication server is completely compromised, the attacker gets BFV ciphertext that is mathematically impossible to invert without the secret key. The biometric template is never exposed in plaintext at any point in the pipeline. This is not defense in depth—it is defense by mathematical construction.
H33 provides post-quantum passwordless authentication infrastructure with FHE biometric processing (BFV lattice-based), STARK zero-knowledge proofs, and ML-DSA digital signatures—all in a single API call at ~50 microseconds per authentication. No passwords. No credential databases. No stuffing attack surface. 1.2 million authentications per second on a single node.