What the result contains
What This Tool Provides
Generate a random password from selected lowercase, uppercase, digit, and symbol pools. The implementation uses crypto.getRandomValues with rejection sampling, guarantees at least one character from every enabled group, and shuffles the result without Math.random.
- 4–64 character output in the interface
- At least one character from each enabled group
- A length/pool-based strength estimate
- Explicit regenerate and copy actions
How to Use This Tool
- Choose lengthPrefer a long value accepted by the account or application.
- Select character groupsKeep the groups the destination supports; at least one must remain enabled.
- Generate and storeRegenerate if needed, copy manually, and save it in an appropriate password manager.
How It Works
A cryptographically secure Uint32 value selects each character. Values outside an even multiple of the pool length are discarded before modulo selection, avoiding modulo bias. One character is selected from every enabled pool, remaining positions use the combined alphabet, and a secure Fisher–Yates shuffle removes predictable group placement.
Worked Examples
Long mixed password
- Input
Length 20 · lowercase + uppercase + digits + symbols- Output
A different 20-character value on every generation
All four selected groups are represented, but no sample output is promised or reused.
Digits-only code
- Input
Length 8 · digits only- Output
An 8-digit random value
The result uses the selected pool only; whether an application accepts or treats it as a password is application-specific.
What the Strength Label Means
The label is a simple signal based on length and how many pools are enabled. It does not model a specific attacker, breached-password reuse, predictable user edits, phishing, server protections, or rate limits. Random length and uniqueness matter more than meeting a visual label.
How Long Is Long Enough
Length is the only setting here that changes the answer by orders of magnitude, and the arithmetic is short enough to check. With all four groups enabled the alphabet is 88 characters — 26 lowercase, 26 uppercase, 10 digits and 26 symbols — so each position contributes log2(88), about 6.46 bits. Total strength is that figure multiplied by the length, which is why adding four characters helps far more than adding a symbol group to a short password.
The table below is that multiplication, nothing more. It is a measure of how much randomness the generator put into the string, not a cracking-time estimate: how long a real attack takes depends on whether the site stores passwords with bcrypt or with unsalted SHA-1, and that is not a property of your password. For context on the policy side, NIST’s published guidance on memorized secrets asks verifiers to allow at least 64 characters, to stop imposing composition rules, and to stop forcing periodic rotation — advice this tool is built around.
| Length | Bits of entropy | Reasonable for |
|---|---|---|
| 8 | 52 bits | A throwaway login with rate limiting; below current guidance for anything else |
| 12 | 78 bits | An ordinary account you also protect with a second factor |
| 16 | 103 bits | The sensible default for anything a password manager will remember for you |
| 20 | 129 bits | Password-manager master passwords, admin accounts, signing secrets |
| 64 | 413 bits | Machine-to-machine credentials no human ever types |
Where the Password Goes Next
A generated value rarely gets used as typed. Dropped into a database or broker connection string, characters such as @, : and / terminate the URL early, so the password has to be percent-encoded for a connection string before it will connect. Config files and HTTP Basic Auth headers want it encoded as Base64 instead, which is an encoding step and not a security one — anyone holding the encoded string can read it straight back.
For a Wi-Fi passphrase, a 20-character random string is painful to read aloud, so it is easier to turn it into a QR code guests can scan. If the credential lands in a JSON settings file, format and validate that JSON afterwards, because a stray quote inside a generated symbol run is an easy way to break a config you cannot then load.
When you rotate a secret across several environment files at once, the risk is not generating the new value but missing one of the places the old one was written. Diffing the old file against the new one shows every line that actually changed, which is faster and more reliable than reading both.
A Secret, an Identifier and a Digest Are Not Interchangeable
These three get reached for interchangeably and they solve different problems. A password is a value chosen to resist guessing, which is what this page produces. A UUID names a record and is designed to be unique, not unguessable — a version 7 UUID even encodes the moment it was created, so using one as a session token or a reset link hands an attacker a starting point.
A SHA-256 digest runs in the other direction: it is derived from content and detects whether that content changed. Hashing a weak password does not make it strong, because the attacker guesses the input and hashes it too. Where a digest genuinely belongs is on the server side, as the stored form of a password, produced by a deliberately slow function such as bcrypt or Argon2 rather than by a fast general-purpose hash.
Signing secrets are the case people most often get wrong. An HS256 token is signed with a shared symmetric secret, so it needs the same high-entropy random value this generator produces, not a memorable phrase somebody typed. Decoding a token shows you its algorithm and claims, and is the quickest way to confirm whether the thing you are protecting is signed with a secret at all or with a key pair, which changes what you need to generate.
Practical Password Hygiene
- Use a different password for every important account
- Prefer longer random passwords when the site allows them
- Store credentials in a reputable password manager
- Enable multi-factor authentication when available
Important Edge Cases
- Turning off every pool produces an error instead of an empty password.
- A destination may reject some symbols or impose a shorter maximum.
- Changing a generated password manually can introduce a predictable pattern.
Limitations
- No password is “unhackable.”
- The strength estimate is not a breach or cracking-time guarantee.
- The generator does not store, recover, or synchronize passwords.
Input handling
Private Browser Processing
Passwords are generated only in browser memory. They are not added to the URL, submitted, logged by tool code, stored, or copied until the user presses Copy.
Google Analytics records page visits and whether a tool finished or failed, but these tool implementations do not send field values, generated passwords, QR payloads, uploaded QR images, or camera frames to analytics or a Tiny Tiny Tools processing endpoint.
Safety note: Do not paste an existing production password into unrelated tools. Save new credentials securely before leaving the page.
See the Privacy Policy for site-wide details.
Questions About This Tool
Does the generator use Math.random?
No. It uses crypto.getRandomValues and rejection sampling for secure, unbiased pool selection.
Does every enabled group appear?
Yes. At least one character is selected from every enabled pool before the full result is shuffled.
Is a Strong label a guarantee?
No. It is a local length and character-pool heuristic, not a promise about every attack or account system.
Is the password stored or copied automatically?
No. It remains in browser memory and clipboard access occurs only after the Copy password button is pressed.