The problem: checking without exposing
Vault Premium includes breach detection. We check your passwords against Have I Been Pwned’s database of over 14 billion leaked credentials. But here’s the challenge: how do you check if a password has been leaked without actually sending the password to someone?
If we sent your password (or even a full hash of it) to an external service, that would defeat the purpose. We’d be exposing the very thing we’re trying to protect.
The answer is a technique called k-anonymity.
What is k-anonymity?
K-anonymity is a privacy technique where your query is hidden among many similar queries, making it impossible to determine which one is actually yours.
Here’s how it works for password checking:
- Your device hashes your password using SHA-1 (this happens entirely on your device)
- We send only the first 5 characters of that hash to Have I Been Pwned
- Have I Been Pwned returns all leaked hashes that start with those 5 characters (typically 500-800 results)
- Your device checks locally if the full hash of your password appears in those results
The key insight: Have I Been Pwned never sees your full hash. They see a 5-character prefix that matches hundreds of other hashes. They have no way to know which one (if any) is yours.
A concrete example
Say your password hashes to 5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8.
- We send only
5BAA6to Have I Been Pwned - Have I Been Pwned returns ~600 hashes that start with
5BAA6 - Your device checks if the full hash appears in that list
- If it does, you get a “compromised” warning
- If not, your password hasn’t been found in known breaches
At no point does your actual password, or even its full hash, leave your device.
Why SHA-1?
You might wonder why we use SHA-1, which is considered cryptographically broken for some uses. For k-anonymity password checking, it’s the right choice because:
- Have I Been Pwned uses SHA-1 as their standard. Using anything else would require sending the full password for server-side hashing, which defeats the purpose.
- We’re not using it for security. SHA-1 here is just an identifier to match against a database. Your vault passwords are protected by AES-256-GCM encryption with your master key.
- The 5-character prefix means even a SHA-1 collision wouldn’t matter. We’re only comparing prefixes, not relying on collision resistance.
What WIGGWIGG never does
- We never send your password (plaintext or encrypted) to any external service
- We never send the full hash of your password anywhere
- We never store breach check results on our servers
- We never log which passwords you check
The breach check runs entirely between your device and Have I Been Pwned’s API. Our servers are not involved.
Beyond k-anonymity: domain breach matching
Vault Premium also checks if websites you use have been breached, using Have I Been Pwned’s breach database. This is different from password checking. We fetch the public list of known breaches and match them against the domains in your vault entries. This tells you things like “the site example.com was breached in 2024, and you have an account there.”
This check uses publicly available breach metadata. No passwords are involved.
The bottom line
Privacy and security don’t have to be at odds. K-anonymity lets us give you actionable breach intelligence without compromising your privacy. Your passwords stay on your device, encrypted with your key, exactly where they belong.
Vault Premium is available for $1 CAD/month with a 30-day free trial. Learn more about Vault features.