This is an article of mine that was published in 2600 magazine - The Hacker Quarterly, Spring 2022
The Problem of Effective and Usable Strong Passwords Author: William Ben Bellamy Jr Note that in this paper the word 'password' is used for both singular words (strings) and phrases that are used as a password. This paper will focus on the following points; • How are passwords attacked • What makes a password strong • Suggestions for building effectively strong passwords Problem Statement: Typically, we each have dozens of passwords that we use regularly. Passwords help to protect the confidentiality, integrity, and availability of the systems and services we rely on. For the past few decades we have been indoctrinated to think that each system requires a password that is; • unique • at least 8 characters long • composed from several character sets • and changed regularly Compounding the problem is that each system/service that requires password authentication can enforce different requirements. This is not sustainable. It forces the typical person to cut corners, and look for 'easy' passwords which leads to writing passwords onto paper near their systems, and use easily guessable words and phrases. I propose that a practical and sustainable solution involves taking into account the techniques that password attacks (cracking) employ, and avoid those techniques in order to produce passwords that are unlikely to be guessed. How Passwords Work: When you type in your password, which is simply a string of characters, your system immediately calculates the hash value of that string. A hash value is produced by an algorithm that accepts any type or amount of material an outputs a fixed length value that uniquely represents the input material, but that cannot be reversed to find the original input material. It then sends the hash value to another system as proof that you are who you say you are - someone with permissions to access that system or service. That system, and network, only ever sees the hash value of your password, never the actual password. The backend system compares the hash value you provided with its own stored copy of your password’s hash value. If the two match, it can be assumed that you typed the correct password and have some degree of authorization on that system. If they do not match then the correct password was not provided and no access is granted. How Passwords are cracked: An attacker who has access to the password hash for an account/service will attempt to 'crack' the hash value in order to learn the original password that was used to create that hash value and consequently have access to that protected resource or system. There are two main approaches to cracking passwords; online and offline. • Off-line cracking generates the hash value of each password candidate and compares it to the hash value being cracked. Tools include John the Ripper, Hashcat, and Rainbow tables • On-line cracking submits generated hash values of password candidates to an online system in real-time until access is granted. Tools include Hydra Passwords usually are represented by their 'hash value'. A hash is a mathematical function that accepts any amount or type of material and produces a fixed length value that identifies the input material both the content and the order, and which is computationally infeasible to reverse the process to determine a password given its hash value. If any portion of that material is changed, the fresh hash will be dramatically different from the previous. Also, it is mathematically infeasible to reverse a hash back to its original input. So a hash is like an absolutely precise fingerprint of the original material. 'Password cracking' is the process of working through a word list, taking each word and hashing it in the same way that an unknown password was hashed. The two hashes are then compared and if they match, you now know the original password. If they do not match, you try the next word in your list. In addition, 'rules' are applied to each word from your list. These rules describe how the initial word should be modified, manipulated, or in some way changed. These changes are intended to test variations on a word in ways that a person is likely to modify a common word in order to harden their password. The language used for rules is rather obscure and difficult to master. So most crackers will rely on existing rule sets rather than fine-tune them for a specific target. The actual word list, however, is often created with a specific target in mind. These manipulations include, along with many, many more: • changing letter case • appending numerals or spaces • prepending numerals • inserting special characters In this way a single word from a word list can be morphed into hundreds of variations, most of which the attacker might never think of. What Makes a Password 'Strong'? There are at least 3 factors that we can easily control that determine how strong a password is. 1. The number of characters making up the password. The more the better. Each additional character astronomically multiples the number of guesses required. Eventually the attacker will reach a point of diminishing returns and terminate the attack. 2. The size of character sets. A character set is a collection of related characters. For example; uppercase English letters, lowercase English letters, Arabic numerals, Roman numerals, special characters, and so on. The more character sets we use in a password, the stronger it will be. It takes 10 symbols to represent the Arabic numerals 0-9. It takes 26 symbols to represent the lowercase English alphabet. So, in general, it is better to use larger character sets, and several of them. • Alpha (upper and lower) = 52 (a-z and A_Z) • Numerals = 10 (0-9) • Roman Numerals = 3 characters in 4 combinations and 1-4 symbols (I-X) (there is no zero) • Typable special characters = ~32 • Alt-characters (extended ASCII) (~129-255) 126 (http://symbolcodes.tlt.psu.edu/accents/codealt.html, http://www.alt-codes.net/) • Unicode - astronomical count, but often impractical to type. (Unicode charts - http://www.unicode.org/charts/) (Typing Unicode http://en.wikipedia.org/wiki/Unicode_input) So the size of a character space composed of upper and lower alpha, numerals, and special characters combined is ~94 potential characters. 2. Length of the password. It is that simple, yet extremely powerful. The longer the better. Every additional character dramatically increases the number of possible character combinations (complexity) making it increasingly computationally infeasible to successfully crack/guess. 3. Frequency of Change. A password is effective only for as long as it takes to crack/guess it. The previous steps will increase the time necessary to crack/guess your password to the point it is no longer feasible for an attacker to continue. A Suggested Solution: The following suggestions will help create effectively strong passwords. You can use some or all of these to build a password. Remember that the key to an effectively strong password is the length of the string, and the size of the character space. Assuming your password is effectively attack resistant to the point is is unlikely to be cracked, you can consider using a single password on many systems, and for a long time. And in any case, if it is cracked the information about you on one system usually does point to the other systems you use. General Suggestions: • Use all the character sets you can. This increases the over all character space size • Build a password that is at least 16 characters in length. Preferably > 24. More on how to make that usable and practical towards the end The detailed steps: • Decide on > 2 core words/strings that will makeup your password. Select words/strings that together give you at least 16-24 or more characters. When choosing these words, try to have the first word begin with a lower case letter greater than 'm'. That way, if the word list is sorted, about the first half of the word list will be processed needlessly. Consider the following: • an obscure word you would like to learn to spell • the name of a plant, insect, location, star, element... • a favorite song title or phrase, a short portion from a poem, scripture... • Include a random string at some point. Consider: • a car license plate number, or portion, you happen to see (ie; YEO-862) • random keystrokes • keyboard geometry • product serial number • a MAC network address • the year of your favorite movie • Include spaces as delimiters between the words. For extra strength, use 2 or more characters (space, underscore, hyphen...) as mixed delimiters. • Include an alt character. This is very powerful since it is seldom in a password cracker’s rules set, and it expands the character space astronomically. You will need to research how to enter ALT characters on your particular system. * • Even better, include an obscure Unicode character. Again, you will need to research how to enter Unicode characters on your particular system. * • Use geeking. Geeking is the practice of exchanging regular characters for others of similar shape or sound. When using geeking, do not use the first opportunity, or all opportunities. For example, if you could geek 5 characters, then actually only geek 2. Below are just a few examples. • 0 <--> O • 7 <--> T • @ <--> a • Vv <--> w • Nn <--> m • $ <--> S • / <--> l • ( <--> c In addition, you can use the core portion of a password over and over and simply increment one character, the salt: • Increment a special for each new password. For example, left to right across the shifted top row of numerals (~...+). This is much more powerful than simply incriminating a numeral. • Increment through the alphabet (a, b, c…) rather than numerically. Things not to include in building a password: • unaltered dictionary words, even in combination • regional terms ('go cats', 'go cards') • simple misspelled words (hackorz) • nomenclature (leet, script kitty) An Example: In this example, note that I am not using all of the possible suggestions. Use those that will help create a long and complex string that frustrates the techniques attackers use to crack/guess passwords. Choose 3 Core words: Let's use 'mood hack coffee'. In this case, 'mood hack' is a phrase with meaning, and coffee is (sort of) unrelated. This also starts with an 'm' or beyond. Add a random string (keyboard geometry): '[poi' This give me 'mood hack [poi coffee' Mixed letter case: 'mood Hack [poi Coffee' Here I change only 2 letters to uppercase. Geeking: 'nnood Ha(k [poi Coffee' Now I change 'm' to 'nn' giving me an extra character along with geeking, and is also later than 'm' in the alphabet. I also change 'c' to '('. Include numerals: 'nnood Ha(k [poi C0ffee' Simply a 'o' to an '0'. Again geeking, but for the purpose of including at least 1 numeral. Large string length (> 16): is now 22. Use > 1 character sets: Here I have uppercase, lowercase, special characters, numerals. That is a character space of ~94 characters. Then for good measure, I append 2 spaces: 'nnood Ha(k [poi C0ffee ' This gives me 24 characters. That means that this password is 1 out of ~94 to the power of 24 (divided by 2 if you want to account for the average number of guesses) possible combinations. That is a really big number of guesses on average to discover this password. How to Remember a Strong Password: So far, great. We have the information for developing a functionally strong password, one that is crack/guess resistant. But, now we have to remember that long string of characters. Regardless of how effective a password is, if it is not easy to remember and use, it won't be. Fortunately there is no real difference between the words and phrases we have already learned as language and those that are contrived for use as passwords. So to 'learn' these stronger passwords, simply use the techniques we used to memorize all of the words and phrases we already know. 1. Keep the length relatively short, 24-32 characters. Balance the number or words with their aggregate length. For example, 2 short words and 1 long word, or 2 long words and 1 short word. I find that < 33 characters is comfortable as long as their is a meaning underneath that makes sense to me. 2. Make the component words memorable. The password needs to be thought of as a single idea rather than a bunch of keystrokes. In the example 'nnood Ha(k [poi C0ffee ' the core idea is 'Mood hack with coffee'. 'Mood' uses 'nn'. 'Hack' uses '('. '[poi' is just easy to type filler. 'Coffee' simply uses a zero. Then end with 2 spaces. And spaces used as delimiters. Just a few tweaks on 3 words that constitute a meaningful phrase. 3. Muscle memory. Open an editor and type your new password over and over until your fingers are comfortable with the movements that are used. Start slow and deliberate, and increase the speed as you are comfortable. The key is that after a short while you will stop thinking about the individual characters you are typing and begin to understand them as a few words, and finally as one movement. For example, type the following; the dir path xcopy format python list computer host Notice how your mind and fingers know commonly typed material as a single movement (each word is a single movement) - you do not think about each letter or the order of letters, you simply think about the word. It is the same as playing a musical instrument. Your hands know how to play an F chord rather than getting each finger to a particular place on your instrument. A G major scale is one long movement rather than a bunch of delicate movements. So practice typing your new password until it is more automatic than deliberate. Conclusion: This approach, or some variation on it, should allow you to consider using a single password on several systems, and for a longer time. That is because if your password hash is stolen, the attacker is unlikely to crack/guess such a long complex password. This approach should also help make longer more complex passwords memorable and usable. *One way to make entering ALT and Unicode characters easier is to, in some very secure way, save your full password and simply copy and paste it when needed. ---[End of Paper]---