A password can satisfy a length rule and still be a poor authentication secret. A familiar phrase, a predictable pattern, or a password exposed in an earlier breach may be among the first values an attacker tries against many accounts.

This creates a practical problem for applications that allow users to choose passwords: checking only syntax does not tell you whether the chosen value is already widely known or unusually easy to predict.

A password blocklist addresses that specific problem. When a user creates or changes a password, the application compares the proposed password with a set of commonly used, expected, or compromised values. If there is a match, it asks the user to choose another password.

This article explains what that control changes, where it belongs in an authentication system, how to implement it without creating new problems, and what it cannot replace.

Model the problem as attacker guess priority

Password strength is not determined only by how many characters a password contains. What matters to an attacker is also how early that exact value is likely to appear in a guessing strategy.

Consider two passwords of the same length. One is a widely reused phrase that has appeared in breach data. The other was generated randomly by a password manager. They have the same character count, but they do not present the same guessing difficulty.

An attacker does not need to enumerate every possible string in alphabetical order. Password guessing tools can prioritize values that people commonly choose, previously exposed passwords, keyboard patterns, and predictable variations. A popular password can therefore be guessed early even if it satisfies a site’s formatting rules.

A blocklist changes the selection process before the password becomes an authenticator:

user proposes password
        |
        v
compare with blocked values
   |              |
 match          no match
   |              |
 reject       continue normal setup

The control is preventive rather than detective. Its purpose is to keep particularly guessable passwords out of the account database in the first place.

Be precise about the threat model

Password blocklisting mainly reduces the risk that a user selects a password an attacker is likely to try early in an online guessing or credential-based attack.

It is useful when users choose their own passwords because human choices are often predictable. It is also useful when a password that looks acceptable under ordinary length rules has already become widely known through previous compromises elsewhere.

The control does not make an accepted password secret. It does not stop phishing, malware, session theft, password reuse at a service whose credentials are later stolen, or an attacker who already knows the user’s current password. It also does not protect stored password hashes after a database compromise; password hashing must address that separate threat.

A blocklist therefore answers a narrow question:

Is this proposed password so commonly used, expected, or already exposed that we should refuse to rely on it?

Keeping that question narrow prevents the control from becoming a vague password-strength oracle that promises more than it can deliver.

Check passwords when they are established or changed

The natural enforcement point is the workflow that establishes a password: registration, password change, and password reset when the user chooses a new secret.

The simplified decision is:

if proposed_password is in blocked_passwords:
    reject it
else:
    continue with the normal password setup process

This is teaching pseudocode, not a production implementation. A real system still needs suitable password-length rules, secure password hashing, rate limiting for authentication attempts, protected transport, and appropriate account-recovery controls.

The timing matters. Checking only during login is too late: the weak password is already an active credential. It can also create confusing behavior if a password that was accepted yesterday suddenly stops working because a blocklist changed overnight.

For most systems, use the blocklist when a password is created or changed. If there is credible evidence that an existing password has been compromised, handle that as an account-security event and require an appropriate credential change rather than silently changing login semantics.

Block values attackers are likely to try

A useful blocklist is focused on high-risk choices, not every string that somebody might dislike.

Reasonable inputs can include passwords known to be commonly used, passwords found in credible breach corpuses, and context-specific values that are especially predictable for the service. For example, the service name or a straightforward derivative may be an obvious choice that deserves rejection when used as the entire password.

The important mental model is guess priority. A value belongs on the list because an attacker is unusually likely to try that complete password, not because the application can find an ordinary word somewhere inside it.

Overly broad substring rules can work against that goal. Rejecting every password containing a dictionary word can eliminate many long passphrases and generated values without demonstrating that the complete password is commonly guessed. It also creates frustrating rules that users may respond to with predictable modifications.

Current NIST password guidance makes the same distinction: compare the prospective password against a blocklist of known common, expected, or compromised passwords, and apply the comparison to the entire password rather than rejecting arbitrary substrings merely because they appear on the list.

Keep blocklisting separate from composition rules

A blocklist and a composition rule solve different problems.

A composition rule asks whether a password has a particular shape, such as containing an uppercase letter, a number, and a symbol. A blocklist asks whether the complete value is already too predictable or too widely exposed to accept.

Those questions can produce very different results. A password can satisfy several character-class requirements while still being a common password with a predictable suffix. Conversely, a long password can lack a symbol while being far less likely to appear early in an attacker’s guesses.

This is why adding more formatting requirements is not a substitute for checking known weak choices. Modern password guidance generally favors adequate length, allowing password managers and paste or autofill, blocking commonly used or compromised values, and avoiding arbitrary composition rules that push users toward predictable patterns.

The exact password policy still depends on the authentication design. For example, a system using passwords as a single factor may set different minimum-length requirements from a system where the password is only one part of multi-factor authentication. Do not copy a numeric threshold from another environment without understanding the assumptions behind it.

Treat external breach checking as a privacy boundary

Some teams maintain a local blocklist. Others use a service that can determine whether a password has appeared in known breach data. Either approach can support the same defensive decision, but the trust boundary is different.

Sending a user’s proposed password in plaintext to an external service would expose the very credential the application is trying to protect. Avoid designs that require an unrelated party to receive the full candidate password.

If you use an external compromised-password service, understand its lookup protocol before integrating it. The design should avoid disclosing the full proposed password to the service, and the application should use the service exactly as documented rather than inventing a home-grown transformation that merely looks private.

Also decide what happens when that service is unavailable. Password creation is a security-sensitive workflow, so the failure policy should be explicit. A high-risk application may choose to delay password establishment until the check can be completed. Another system may use a sufficiently useful local list as a fallback. The right choice depends on availability requirements, the quality of the local data, and the consequences of accepting a weak password.

Do not let an accidental network timeout silently choose the security policy for you.

Give the user a useful rejection

When a password is blocked, the user needs to know what to do next.

A response such as Password does not meet requirements encourages trial and error. A clearer message can say that the password is commonly used or known to be compromised and that the user should choose a different, unique password. The interface can also encourage a password manager to generate and store one.

Do not reveal unrelated account information in the process. The blocklist check concerns the proposed password, not whether another person uses it or which breach contained it.

Avoid showing the user the blocklist or returning detailed ranking information. The goal is to steer the user away from a poor choice, not to provide a password-analysis service.

Update the list without turning it into a denial tool

A static list becomes less representative over time as attackers learn new common choices and new breach data becomes available. Plan a controlled way to refresh the blocklist or its source.

More entries are not automatically better. An enormous list can reject uncommon passwords that are unlikely to be reached during a realistic online guessing attempt, increasing user friction for little additional protection. The useful size depends on how the list is built and how authentication attempts are rate-limited.

Changes should also be operationally observable. Track metrics such as how often password establishment is rejected because of the blocklist, whether the lookup dependency is failing, and whether users repeatedly submit trivial variations after a rejection. These metrics can reveal a policy that is either ineffective or unnecessarily frustrating without recording proposed passwords themselves.

Never log the candidate password to make those metrics easier. Log the decision and non-sensitive operational metadata, not the secret value.

Test the control as a security decision

A blocklist is simple enough that teams sometimes test only the happy path. The important tests are at the boundary.

Verify that a known blocked password is rejected during registration, password change, and password-reset completion. Verify that an acceptable password proceeds through the same secure hashing path as before. Confirm that logs, traces, analytics, and error-reporting systems do not capture the proposed password.

If the check depends on a remote service, test timeouts and service failures so the documented failure policy is actually enforced. If the application normalizes password input, make sure the blocklist comparison and later password verification use compatible handling; otherwise the system can make inconsistent decisions about what value the user established.

Finally, verify that password-manager autofill and paste still work. A control that pushes users away from generated unique passwords can undermine the broader authentication design.

Combine the blocklist with controls for different failures

Password blocklisting is useful precisely because it does one job well. Other controls are still necessary because attackers have other paths.

Adequate password length makes a broader range of guesses expensive. Rate limiting constrains repeated online attempts. A password-specific hashing function raises the cost of offline guessing if stored hashes are stolen. Multi-factor authentication can reduce the damage from a compromised password when the additional factor resists the attack being considered. Phishing-resistant authentication can address threats that password quality cannot.

These controls are complementary because they act at different stages. The blocklist improves the credential before it is accepted. Rate limiting constrains attempts against it. Password hashing protects its stored verifier. Additional authentication factors can require evidence beyond the password.

Do not describe a password as safe merely because it passed the blocklist. Passing means only that this particular check did not identify the value as one that should be refused.

Conclusion

A password blocklist is most useful when treated as a focused admission control for user-chosen passwords.

Compare proposed passwords with a maintained set of complete values that are commonly used, expected, or known to be compromised. Reject matches when passwords are established or changed, explain the rejection clearly, protect the candidate password during any external lookup, and define what happens when the checking mechanism is unavailable.

Then keep the guarantee narrow. A blocklist reduces the chance of accepting passwords attackers are especially likely to guess; it does not replace length requirements, rate limiting, secure password hashing, multi-factor authentication, or incident response. That clear boundary makes the control easier to implement correctly and easier for users to understand.