The problem with passwords
Most people use weak passwords, even though they might not realize it. The solution is simple: use strong passwords — ones that contain both upper and lower case letters, numbers and special characters (!"#$%& etc). So that’s the password problem solved, right?
Unfortunately, no. Password strength isn’t the biggest issue. Reusing passwords is. Odds are you reuse passwords too.
Your password can be a million characters long, contain all that’s mentioned above plus all Greek, Cyrillic and Chinese characters, but still, be rendered useless if you use it on more than one website. Many websites don’t store passwords securely — and get hacked. Your password can be obtained and whether your password is
BbPzgEDpa8bXN8Ftq9MVwWqdSAA3Xn3595azebav5ZBmEjFzvZjc6rup2c33xbdeDqpNXvf6SaGaHuFTgFufDa3Uj2N7v2d2eit doesn’t matter.
Websites get hacked, passwords get leaked, people get hacked.
So the solution is a unique strong password for each website/service. But how the hell are we supposed to remember all those passwords?
Enter password managers
Password managers make it easy to remember a single password, and still have long, unique passwords on all of your accounts. How is this possible? You use just one password to unlock your secure password “vault" and optionally use a key file if the program permits one. From your vault, you can quickly fill out login forms on all of your devices. Password managers are tools that generate and store your passwords.
But doesn’t that create a single point of failure — how is that different from writing your passwords on a paper? Password managers use encryption, so as long as you use a strong master password (the one used for decrypting the password manager’s data) and key file, you don’t have to worry. You might already be using your browser’s “Remember password” feature. The issue with that feature is that it’s not secure and it doesn’t support generating strong passwords.
Keeping your passwords secure means that you've taken reasonably thorough precautions to prevent unauthorized people from finding or stealing them. In some cases you may be legally obligated to do so, for example if you run a business and your passwords could give someone access to legally-protected confidential information about your customers, clients, patients, employees, intellectual property, trade secrets, and more.
Security and convenience are usually at odds with each other. When you make something more secure, you're also likely to make it less convenient. Unfortunately, that's the modern cost of protecting yourself.
However, no security is perfect. Every system has its potential vulnerabilities. It's important to access your threat model, think about the worst-case scenarios, and then make choices that are reasonable given your circumstances.
Password storage methods that are not secure
Some popular places where many people store their passwords that make them very vulnerable to being stolen.
Passwords written on paper (that are not under lock and key.) Anyone with access to your home or office could easily find and steal passwords stored like this.
Passwords stored in your computer (without using encryption):
- Remembered in your web browser
- A document called "Passwords" that you've created anywhere on your computer, perhaps using Microsoft Word or Excel
- A document with any other name on your computer
- Email drafts that you've created (but not sent) containing password information
Anyone with access to your computer could easily find and steal passwords stored like this, including both a person with physical access to it as well as a virus or cyber-thief gaining access via the internet, or scamming you into granting them access, even once.
Passwords stored in your smartphone or tablet (without using encryption):
- Electronic "Notes" containing password information
Anyone with access to your device could easily find and steal passwords stored like this.
Passwords sent via regular (insecure) email:
- Emails that you have sent to yourself containing password information
- Emails that you have sent to anyone else containing password information
Any information that you send using regular (unencrypted) email puts that information at risk of being stolen. Email is neither private nor secure. Sending an email is like mailing a postcard, and cyber-thieves can easily read the contents. You should never send passwords (or any other confidential or sensitive data) via regular email.
Creating a strong master password
Choosing the right password manager
There are two kinds of passwords managers: online and local.
Online based password managers services have become very popular, including Lastpass, Dashlane, 1Password, and others. These services typically store your passwords in a secure, encrypted database that may be located on your computer, but is also stored online ("in the cloud") and can be synchronized among your devices. This makes your passwords available to you from any computer or mobile device, as long as you remember your master password.
While that's very sophisticated and convenient, in my opinion, any data that you store online is by definition less secure than data that you store only on your computer or on other offline devices in your possession. You have to trust that the service you're using will store your data securely — you have no idea what happens behind the scenes, be available when you need it, not have a security breach (get broken into by hackers), not lose your data, not have a rogue employee, not give your data to someone else (like the government), not close your account, not go out of business, or not otherwise put your data at risk, even if it's encrypted. As a side note, some online services don't make it very clear how to back up your data, which further reduces your ability to protect your data yourself.
So, in my opinion, I don't care how secure or encrypted such services are. The risk of using them far outweighs their convenience. Thus, I do not recommend storing passwords (or other extremely sensitive data) online or "in the cloud," nor letting such data get transmitted or synchronized over the internet, period.
Local password managers offer higher security than online password managers but are far less practical. You need to backup it regularly, store it in your own cloud server or with dropbox or any platform and encrypt it using cryptomator. If you aren't comfortable with DB, have a look at Nextcloud's provider database that uses Nextcloud. Generally, you want to use open-source software whenever you (can) in practice. You check if it’s been audited or just hope it’s been peer-reviewed. For syncing your password database across devices, try Syncthing:
Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it’s transmitted over the Internet.
It's very easy to install and you can add devices very very easily. I don't suggest syncing the database with any cloud service as your database will be left vulnerable to attacks.
However, there’s a password manager which doesn’t fit into either category. Neither online nor local. It’s based on a single algorithm, called deterministic password. It uses your full name and master passwords as a source of randomness (also known as entropy in this context) and generates passwords based on the service name, domain, or whatever you decide to use (for Twitter you might use
twitter.com). The downside to this is not having a list of all your accounts, which might actually be a good thing — it removes the single point of failure thing to some extent. Another downside is it's very impractical especially to today's standards and advances employed by crackers. One such tool for password cracking advertises eight million per second, and it's only getting better and faster.
One important note: Do not use Autofill/Autotype. There are proven cases of ad networks deploying fake hidden credential fields to steal your username and password. Disabling auto fill ensures user interaction is required to use your credentials. There is even a demo showcasing autofill abuse.
Now you can decide. It’s up to you. Do you need a list of accounts? Do you need maximum security, or prefer usability?
Here’s a list of recommended password managers for each kind:
- BitWarden (Cross-platform)
- KeePassXC (Cross-platform)
- Password Safe (Windows only) - with unofficial ports for macOS and Linux
- KeePass2 (Windows only) - with unofficial ports for macOS and Linux
Notes on BitWarden
I would recommend BitWarden to users who are new to password managers and the average person in general. They have easy to use apps for every single platform, they integrate with every web browser, and it’s completely free to use the basic features. You can easily sync your passwords between different devices.
BitWarden also allows you to host your own implementation using Docker.
Notes on KeePass 1.x/2.x and KeepassXC
A setting that helps make your KeePass file more secure by deterring dictionary and brute force attacks that often gets overlooked is called "Key Transformation" you can find it in KeePass 1.x/2.x under File > Database Settings > Security. In KeePassXC you can find it under Database > Database Settings > Security > Encryption Settings tab and use the slider to set your preferred time. 1 second is more than enough, but if you want to be extra secure set it to 3 or more seconds.
What it does is run the master key through N rounds of encryption before applying it. The higher the N, the more time it takes your CPU to process through all the rounds of encryption. The default is 6000 which takes less than a millisecond for a modern CPU to churn through. My setting is in the high 7 figures and takes about one second. That is a delay I can live with each time I attempt to open my KeePass file. In fact, it kind of feels good to be reminded the program is doing extra work to protect me.
The reason for introducing a delay is to slow down a brute force attack to the point it is unfeasible in this lifetime. A brute force attack starts by trying every character (A-Z, a-z, 0-9, symbols), then every two character combination (aa, ab, ac…), then every three character combination (aaa, aab, aac), and so on. A related approach, called a dictionary attack, loops through a dictionary and tries all words and various combinations of words with different delimiters. Eventually, these approaches will find the master password. However, when N is a high enough number, it will cost the attacker one second per attack (per CPU), which is a serious roadblock.
If your password is sufficiently strong, say 30 random characters including A-Z, a-z, 0-9, and 10 different possible symbols, that is 72 characters to draw from. That results in 72^30 = 5.24e+55 possible combinations! Only an attacker with a huge number of CPUs or a huge amount of time would be able to check all combinations. I doubt this little technique would deter high-level national security organizations with billions of dollars in funding. However, I have a strong sense that a high N would deter script kiddies and cracking programs.
As CPUs get faster, N needs to increase to offset the time it takes to attempt a single crack at the master password. I plan to increase the value every time I get a new machine.