"Use uppercase, numbers and symbols" is the most repeated security advice — and the one that explains its reasoning the least. The real force behind a strong password is a single number: entropy, measured in bits.
What password entropy is
It's calculated as length × log2(alphabet size). The "alphabet size" is how many distinct characters you could have used in each position:
- Lowercase only: 26 characters → log2(26) ≈ 4.7 bits per character.
- Lowercase + uppercase + digits + symbols: ~94 characters → log2(94) ≈ 6.55 bits per character.
An 8-character password using all four types has ≈ 52 bits. A 16-character, lowercase-only password has ≈ 75 bits. The second is far harder to brute-force, even though it "looks" weaker at a glance. Length weighs exponentially more than character variety.
How many bits you need, by risk level
| Bits | What it means |
|---|---|
| < 30 | Cracked in seconds, even with a limited online attack |
| 30–50 | Vulnerable to an offline attack with consumer hardware |
| 50–70 | Reasonable for everyday accounts |
| 70–90 | Strong, suitable for password managers and master keys |
| 90+ | Very strong, cryptographic-key territory |
The passphrase trick
If you have to memorize a password (your password manager's master password, say), four or five random words (correct-horse-battery-staple) give you more entropy than a word with substitutions like P@ssw0rd! — and they're much easier to remember. Classic dictionary attacks test individual words, not long combinations of unrelated ones.
The rule that actually matters
No password, however strong, protects you from reusing it. If a site's database leaks, an attacker tries those same credentials everywhere else (credential stuffing). The combination that works is: a unique password per site + a password manager + length over complexity.
Generate passwords up to 128 characters with the secure password generator — you'll see the entropy in bits update live as you adjust length and character types. Passwords are generated with crypto.getRandomValues() (cryptographic randomness, not Math.random()) directly in your browser, never sent to a server.

