Password Generator
Generate provably unbiased, cryptographically secure passwords — on a page that stores nothing and sends nothing.
Require-every-set retesting makes true entropy negligibly lower than the figure shown.
Download saves these passwords to your disk as a plain-text file.
Press ? for shortcuts · Generated in memory only — nothing is stored, nothing is sent.
This page loads no third-party code — no ads, no trackers, no analytics. Verify in your Network tab.
Do it offline:$ LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo
How to use it
- Pick a length from 8 to 128 — default 20 — and switch lowercase, uppercase, digits and symbols on or off.
- Tune the pool: edit the symbol set, exclude the look-alikes Il1O0o|, or require one of each selected set.
- Press Generate (⌘/Ctrl + Enter). The meter reports exact bits and average crack time at 10¹² guesses per second.
- Copy one result or up to 1,000: per-row copy, Copy all, or Download .txt, one per line.
- Share links carry settings only — length, sets, count. Passwords are never in the URL.
Set a length, pick character sets, generate: cryptographically secure passwords drawn on this device from your browser's CSPRNG, rejection-sampled so every character is equally likely. The meter prints entropy arithmetic, not a color-graded verdict. Make one password or a thousand, copy or download them — nothing is stored and nothing is sent.
How it works
Each character starts as a uniform 32-bit word from crypto.getRandomValues, mapped by rejection sampling: for an alphabet of n characters, limit = 2³² − (2³² mod n); words at or above the limit are discarded, survivors map as alphabet[word mod n]. Discarding the uneven tail keeps every character equally likely.
Both shortcuts are rejected: plain modulo is biased — 2³² is rarely a multiple of the alphabet size, so early characters win an extra chance — and Math.random() is not cryptographic: future output is reconstructable from past output. The CLI line below rejection-samples the same way: tr -dc deletes bytes outside the set.
Require-one-of-each never patches characters in afterwards, which would skew positions; the whole candidate is regenerated until every selected set appears, keeping results uniform. The printed formula then overstates true entropy by about 0.13 bits at the defaults — stated, not hidden. Crack time is the average case: 2^(bits−1) guesses at 10¹² per second.
Examples
length = 20 · all four sets · count = 12.+4AbFMu=ku%LBP[K!BThe stock pool is 85 characters — 26 lowercase, 26 uppercase, 10 digits, 23 symbols — so 20 × log₂(85) = 128.2 bits: about 6.1 × 10^18 years of average offline search at 10¹² guesses per second. Outputs are random by construction — this one is illustrative, shape-verified against the live engine, never byte-compared.
length = 16 · symbols offPxhMt2hT5nIpi2h4Letters and digits leave a 62-character pool: 16 × log₂(62) = 95.3 bits, ~7.6 × 10^8 years. Length beats charset — 16 characters with symbols reach 102.6 bits; 20 without reach 119.1. When a site rejects symbols, add length.
length = 32 · lowercase + digits · count = 100bdfkln0rif0iccd9welnojfv2aykssty
4kwsgm0245vpqq45hqvbdrnvtcllivuz
u4my0k2ocevse502eicbly9s0wm8dl6nBulk for fixtures and seed data: 100 passwords of 32 characters from the 36-character lowercase-plus-digits pool, 165.4 bits apiece. Three of the hundred are printed; Download .txt carries all, one per line, in one instant pass.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
What “exclude ambiguous” removes
Exactly Il1O0o| — capital I, lowercase l, one, capital O, zero, lowercase o, pipe. With every set on and the stock symbols, the pool shrinks from 85 to 79 characters and 128.2 bits to 126.1 at length 20.
The require-each floor
It needs length ≥ the number of selected sets — automatic here, with four sets and a floor of 8. The refusal that can fire is a required set emptied by exclusions: generation stops and names it.
Clipboards outlive the page
Copying is the one exit this page cannot fence: clipboard managers keep history, and some OS clipboards sync across devices — the tool says so once per session, on first copy.
Output is data, not prose
The pane is marked translate="no" and forced left-to-right, so translation and RTL locales can never reorder what you copy. Copy reads the generated string, not the screen; blocks-of-4 grouping is pure spacing, zero inserted characters.
Bulk is instant
The worst case — 1,000 passwords of 128 characters, 128,000 draws — runs in a few milliseconds with no worker. Past either limit the engine declines and quotes the rule; nothing is clamped or quietly truncated.
Common errors
Select at least one character set.- All four set switches are off, so there is nothing to draw from — turn one back on.
Symbol set contains whitespace — space-like characters are invisible in a password and often stripped by forms. Remove them to continue.- A space, tab or line break sits in the symbol editor, usually a paste artifact; the range points at the first one.
Length must be a whole number between 8 and 128.- Fractional, negative or out-of-range lengths are refused; hand-edited share links are validated like typed input.
Count must be a whole number between 1 and 1,000.- Batch size is a whole number up to 1,000; past the cap the engine refuses instead of clamping.
No characters are available to draw from — the selected sets are empty. Add characters to the symbol set, enable another set, or turn off exclusions.- Every character got excluded — say, a symbols-only pool emptied by the ambiguous filter; the message lists the three ways out.
FAQ
Are password generators safe to use?
Check rather than trust: open your browser's Network tab and generate — zero requests leave, this page loads no third-party code, and generation is a local crypto.getRandomValues call. Nothing lands in browser storage or on disk unless you download.
How long should a password be?
Longer beats fancier: entropy is length × log₂(alphabet size), so each character from the 85-way pool adds about 6.4 bits. NIST SP 800-63B sets 8 characters as the minimum for user-chosen secrets. The default here is 20 characters, 128.2 bits.
Why not Math.random() for passwords?
It is a statistical generator — fast, seedable, reconstructable: observing a few outputs lets an attacker predict the rest. crypto.getRandomValues draws from the operating system's CSPRNG, built to stay unpredictable; even that needs rejection sampling on top, because uniform words turn biased when squeezed through an uneven modulo.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Regenerate the whole batch; settings stay put.
- ⌘/Ctrl + S
- Save the batch as a .txt file — here the shortcut downloads rather than saving the page.
- ⌘/Ctrl + C
- Copy the output when nothing is selected and focus is in the tool; a selection copies itself.
- ⌘/Ctrl + Shift + C
- Copy the output even while a selection is active.
- ? or ⌘/Ctrl + /
- Open the shortcut help overlay.