Credential stuffing and brute force protection for logins
A combo list from someone else's breach, replayed one pair at a time against your login form.
How a credential stuffing run works
A loop over email:password pairs, POSTing each to the login endpoint. Funded kits drive a real browser and rotate residential exit addresses, so per-IP limits never bite.
How PrivCaptcha stops credential stuffing
Four steps, with the numbers the server uses. Nothing here is configured by you.
One token per pair, spent once
A solved puzzle mints a token and the verify spends it. A million pairs needs a million challenges.
What the run scores on arrival
A bare HTTP client with bot user-agent and no Accept-Language scores 20+40+15=75, level 4: 10 degrees, 6 pixels, 10 shapes.
Missed puzzles compound to level 4
Misses add 8 each, capped at +40. Five misses take that profile from 20 to 60, level 4: 10 degrees, 6 pixels.
Proof-of-work priced off the score
Proof-of-work scales with risk: 14 bits at 20, 18 bits at 75. It is checked first, so the work is spent on wrong answers too.
Add PrivCaptcha to your login form in two lines of code
Script tag, container in front of the submit button, and your existing verify call. Already on reCAPTCHA or hCaptcha? That backend code stays exactly as it is.
Inside the login form, so privcaptcha-response posts with the username and password.
The login handler verifies the token against /api/v1/siteverify before any password comparison.
A re-rendered form carrying the old privcaptcha-response gets invalid-input-response. Reset the widget on every failed login.
What this does not solve about credential stuffing
This is a price, not a cap. A correct pair still passes. Lockout, breached-password checks and MFA remain yours. Rotating residential exits resets the daily counter.
Common questions about credential stuffing
How PrivCaptcha prices credential stuffing, and what it does not do about it.
Put PrivCaptcha in front of your login form
10,000 verifications a month are free, and the integration is the one you already have.