I think passphrases are a good idea. Requiring a passphrase forces people that
tend to choose weaker passwords to choose better passwords without really
thinking about it. I'd say most passwords are upper/lower letters and numbers 6
to 10 chars long.
- Code: Select all
>>> (26*2+10)**6
56800235584
>>> (26*2+10)**10
839299365868340224
Not great in theory and even worse in practice. These average passwords are
probably also really weak passphrases.
Consider this advice associated with a password creation field: "Your password
should be at least 8 characters long, contain upper and lower case letters and
some numbers. Memorize it."
A user is probably more likely to come up with something like "M0onUn1t"
instead of "8KdyP5t0lQgg". From a purely brute force perspective "M0onUn1t" may
seem reasonable at over 218 trillion combinations before you're guaranteed to
crack it.
- Code: Select all
>>> (26*2+10)**8
218340105584896
...but "M0onUn1t" is equal to the two word passphrase "moon unit" with the
right dictionary. Let's take that dictionary of 40000 common words and include
l33t-sp34k variations. Say this dictionary is now maybe 65000 entries or even
80000.
- Code: Select all
>>> 65000 ** 2
4225000000
>>> 80000 ** 2
6400000000
You could probably bang that out within the day on an old computer.
That same user could be asked to create a passphrase with this advice instead:
"Create a passphrase at least 8 words long. Memorize it." The user might come
up with something like "lol frank zappa named a kid moon unit"... the bare
minimum. Brute forcing a string that long would be tough:
- Code: Select all
>>> 27**37 # even if you know it's just lower letters and spaces
91297581665113611259115979754590511595360241199911147L
A dictionary approach isn't much better even if you know the passphrase is
minimum length and just common words:
- Code: Select all
>>> 40000 ** 8
6553600000000000000000000000000000000L

I made a lot of assumptions here but I think even small passphrases are better
than trying to enforce strong passwords.