Correct Horse .org

Passwords done right

Your Correct Horse password

Generate a new one by clicking the button


I want more options …

The password is generated from the following words:

Why is this a good password?

What makes a good password?


The password above contains 52 bits of entropy. This means, it is as random as the result of throwing 52 coins in a row. The reason for that is because every word has been randomly selected from a list of over 8192 distinct words—corresponding to an entropy of 13 bits.

That means, it is as random, as a completely random password of length 8 generated from uppercase letters, lowercase letters and numbers. However it is much more memorable than a complete random password of 8 characters. Or as Randal Munroe puts it:

This is taken from Randall Munroes famous carton XKCD (xkcd.com).

Why can I trust this page …

… with something such important as my passwort?


Short answer: You shouldn't. You shouldn't trust any website with that.

However, this page is made as simple as possible (from the code point of view). So you can convince yourself that

  • the password is generated completely random (as far as your browser implements Math.random()),
  • the password is not send to the server,
  • nothing else is done except for the password generation.

Because the password is never sent to any server, also nobody in between could have read the password above (except from the coworker standing behind you). In order to make sure, that also this web page has not been modified at all, you should check that you connected this website securely via https and the connection is using a trusted certificate.

By viewing the source of this website, you can see that the only code inserted (at the bottom of the page) is the snippet you can see below. There is no JS-Framework use, no ads are embedded, neither is google analyics, there is no facebook-botton, nothing. Feel free to share this page on facebook anyway! :)

<script>
    function generatePassword() {
        var wordlist = document.getElementById("wordlist").value.split(" ");

        var password = "";
        for (var i = 0; i < 4; i++) {
            var randomIndex = wordlist.length;
            while (randomIndex >= wordlist.length) {
                randomIndex= crypto.getRandomValues(new Uint16Array(1))[0];
            }
            password += wordlist[randomIndex] + " ";
        }

        document.getElementById("password").value = password.trim();
    }

    generatePassword();
</script>

Which words are used?

Can I download the wordlists?


The wordlists used can be downloaded here:

English: english.txt

8239 words

SHA256: 653feb8810030900e2ae28157cfb67d5fd818a40f966490202cb4b892201dfe0

Deutsch / German: german.txt

7450 words

SHA256: facbd5327d539236af52a1bb7c0b786444f2259cb54b08236c08cf2b75d806cf

Français / French: french.txt

7937 words

SHA256: 4b2ca906b0cc99b7913299cef5b34749db89ba42ee92ef86c6605efc2e5739bf

Nederlands / Netherlands: netherlands.txt

8972 words

SHA256: b91cebd43bd96c9499cfc2f7a36ccb7fa2e8442b390f282125280cb73c63500c


These wordlists are taken from the Wortschatz project of the Leipzig university, Germany. They are licensed under CC-BY-NC according to the Wortschatz terms of usage. Words containing anything else but letters have been filtered out. Also, the lists have been converted to full lowercase.

You can use these files to generate your password locally. If you are using Linux, you can just invoke the following command (replacing <file> with the actual file):

shuf -n 4 <file> | tr '\n' ' '