Random Text Generator
Generate random strings or word-list passphrases from the browser crypto source, with the entropy in bits shown for your settings.
Random Text Generator workspace
Entropy: 112.9 bits per value — very strong
Every character is drawn with crypto.getRandomValues and rejection sampling, so each character of the selected set is equally likely. Nothing is stored: reload the page and the value is gone.
Text Statistics
Everything on this page is computed in your browser. Nothing is uploaded, and nothing is saved between visits — closing the tab is enough to clear it.
Using Random Text Generator
Choose a random string or a passphrase, and how many values you want — up to 50 at once.
For strings, set the length up to 4096 and tick which character classes to draw from.
Leave 'exclude look-alike characters' on if the value will be read aloud or typed from paper.
Check the entropy figure shown for those settings, then press Generate.
Copy what you need before you leave the page, because nothing is kept.
Every character is drawn with `crypto.getRandomValues` and rejection sampling, so each member of the selected set is equally likely. The entropy reported in bits is exact for the settings on screen, because no hidden composition rule quietly shrinks the space of possible outputs.
Random character strings and word-list passphrases, generated in the page with an entropy figure next to them so you can tell whether what you just made is actually strong.
Where the randomness comes from
Every character is drawn using crypto.getRandomValues, the browser's cryptographic random source, with rejection sampling on top.
The rejection step is the bit that usually gets skipped. A 32-bit random number has 2^32 possible values, and 2^32 divides evenly by almost no alphabet size (50 and 62 both leave a remainder). If you took the remainder directly, the first few characters of the set would come up slightly more often than the rest, and that small bias adds up across every position. So draws that land in the uneven tail are thrown away and drawn again. The loop costs microseconds, and every character ends up exactly equally likely.
Math.random() wouldn't do. It's fast and evenly distributed, but it's predictable: its internal state can be recovered from a short run of outputs. crypto.getRandomValues draws from the operating system's entropy pool.
What the bits figure means
Entropy in bits is the base-2 logarithm of how many equally likely values the generator could have produced. Each extra bit doubles the search space.
The default settings are 20 characters from lowercase, uppercase and digits, with look-alikes excluded. That leaves a 50-character alphabet, so the figure reads 112.9 bits. It's 20 × log2(50), and it's exact, because there's no hidden "must contain one digit" rule quietly shrinking the set of possible outputs. Rules like that are what make most strength meters wrong. Every constraint removes candidates, so the true bit count goes down.
The page shows the band next to the number: under 40 bits is throwaway test data, 40 to 60 is only acceptable behind serious rate limiting, 60 to 80 is strong, and anything above that is beyond brute force.
Passphrases against character strings
Passphrase mode draws whole words from a 455-word list, joined by a separator you choose. Each word adds about 8.83 bits, so five words carry 44.1 bits and seven carry 61.8. If a person has to retype it, seven words is the sensible minimum.
Two options barely move the number, and that's deliberate. Capitalise each word applies the same change every time, so it adds no uncertainty at all, and the tool doesn't pretend it does. Append a digit adds log2(10), or 3.3 bits, taking five words from 44.1 to 47.5. Neither one turns a short passphrase into a good one.
The word list isn't a secret and can't be, so assume an attacker has it. All the strength comes from how many words you drew, and the bit count already reflects that.
Excluding the look-alike characters
The look-alike filter removes I l 1 | O 0 o B 8 S 5 Z 2, the glyphs people misread off a screen or a printed sheet. Use it for anything that'll be read out over the phone or typed in from paper.
It does cost entropy. The 62-character alphanumeric set drops to 50, so a 20-character string falls from 119.1 bits to 112.9. At this length that's a fine trade. At very short lengths it's a poor one, and the fix is to add a character, not to keep the ambiguous ones.
What the number doesn't cover
An entropy figure describes the generator. It can't tell you whether the service you paste the value into hashes it properly, or whether the machine you generated it on is already compromised.
Nothing is saved here; reload and the value is gone. Pressing Copy does put the value on your system clipboard, though, and other applications can read it there. Paste it where it belongs, then copy something harmless over it.
Elsewhere in the toolset
- UUID Generator: identifiers, for when you don't need a secret.
- Hash Generator: digest a value instead of inventing one.
- Lorem Ipsum Generator: readable placeholder prose for layout work.
Frequently asked
How is the randomness produced?
With `crypto.getRandomValues` plus rejection sampling: draws that fall outside an even multiple of the alphabet size are discarded and redrawn, so no character is favoured by modulo bias.
What does the entropy figure in bits actually mean?
It is the base-2 logarithm of how many equally likely values your settings could produce, so each extra bit doubles the search space. Twenty characters drawn from a 50-character set gives 112.9 bits.
Does capitalising each word make a passphrase stronger?
No, and the bit count does not pretend otherwise. The same transformation is applied every time, so it adds no uncertainty; only adding words or appending a digit moves the figure.
Is anything I generate here stored?
No. Values live in the page and vanish on reload, and browser-storage keys left behind by older builds are purged when the tool loads.