Restructure project to have blog as subsection
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,239 @@
|
|||||||
|
+++
|
||||||
|
title = "Exploring the World of Password Managers"
|
||||||
|
[taxonomies]
|
||||||
|
tags = [ "privacy", "security", "passwords" ]
|
||||||
|
+++
|
||||||
|
|
||||||
|
Passwords are miserable to deal with. Bad passwords are both terrifyingly
|
||||||
|
tempting and incredibly common. Good passwords and hygiene all but require
|
||||||
|
complicated management schemes like password managers and a fair bit of
|
||||||
|
diligence. At the same time, passwords are used so frequently that it's most
|
||||||
|
practical to have access to all of your passwords on every device.
|
||||||
|
|
||||||
|
On the other hand, password breaches are so commonplace that just about anyone
|
||||||
|
who's used the internet in the past 20 years has probably had one compromised.
|
||||||
|
While efforts to supplement and displace passwords as the standard form of
|
||||||
|
authentication are slowly gaining traction, it's inevitable that passwords are
|
||||||
|
going to remain a core part of digital security for the foreseeable future.
|
||||||
|
|
||||||
|
Fortunately, many of the pitfalls of passwords can be mitigated through
|
||||||
|
two-factor authentication, or `2FA`. Even so, it is frighteningly common for
|
||||||
|
companies to rely on `SMS` for `2FA`, or otherwise allow `2FA` to be bypassed
|
||||||
|
through social engineering, access to a phone number, or an email.
|
||||||
|
|
||||||
|
In this post, I'll be talking about the password managers I've used and
|
||||||
|
recommend. Then, I'll outline the properties a good password manager should
|
||||||
|
have. Finally, I'll show you the solution I've settled on for my own needs.
|
||||||
|
|
||||||
|
As a small disclaimer, I'm not a cryptographer. My formal training essentially
|
||||||
|
boils down to a few first-year intro to CS classes in I took this year in
|
||||||
|
college. However, I have spent the last few years of my life researching
|
||||||
|
privacy and digital security. So, while I'll be talking a lot about different
|
||||||
|
password managers, remember that the best password manager for you is the one
|
||||||
|
that you fully understand.
|
||||||
|
|
||||||
|
## You Should Just Use a Password Manager
|
||||||
|
|
||||||
|
For most threat models, this is a solved problem. Problems that are as important
|
||||||
|
yet difficult as password management have many pre-existing solutions for all
|
||||||
|
sorts of devices, security levels, and preferences.
|
||||||
|
|
||||||
|
My go-to recommendation for people is [Bitwarden](https://bitwarden.com/).
|
||||||
|
Bitwarden is an Open Source password manager with secure cloud sync, convenient
|
||||||
|
and appealing clients for nearly every platform, and a very generous free tier.
|
||||||
|
They have a track record of good performance in [third-party security
|
||||||
|
audits](https://bitwarden.com/blog/third-party-security-audit/), [a browser
|
||||||
|
extension](https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/),
|
||||||
|
and [zero-knowledge cloud
|
||||||
|
sync](https://bitwarden.com/help/what-encryption-is-used/) with standard,
|
||||||
|
reliable cryptography.
|
||||||
|
|
||||||
|
If you're more the self-hosting type, the [official Bitwarden
|
||||||
|
server](https://github.com/bitwarden/server) is fully Open Source and available
|
||||||
|
as a Docker image. The popular and lightweight
|
||||||
|
[vaultwarden](https://github.com/dani-garcia/vaultwarden) is an alternative
|
||||||
|
server implementation (written in Rust!) that's compatible with the regular
|
||||||
|
Bitwarden client applications, making deployment for individuals, families, and
|
||||||
|
small teams really easy.
|
||||||
|
|
||||||
|
Don't like the cloud? [KeePassXC](https://keepassxc.org/) is a Free Software
|
||||||
|
application that provides a local password database with various additional
|
||||||
|
encryption options such as keyfiles and a hardware token Challenge-Response.
|
||||||
|
|
||||||
|
While I don't necessarily recommend relying on them, there are even more
|
||||||
|
options if, for some reason, the above options don't work for you.
|
||||||
|
[1Password](https://1password.com/) provides a pretty seamless experience,
|
||||||
|
especially within the Apple ecosystem. Your [browser probably has one built
|
||||||
|
in](https://www.mozilla.org/en-US/firefox/features/password-manager/), and
|
||||||
|
[maybe even your Operating System,
|
||||||
|
too](https://support.apple.com/en-us/HT211145). These options can be especially
|
||||||
|
useful if the user is only going to use a password manager if it's less
|
||||||
|
friction than whatever they were doing before. Any password manager is going to
|
||||||
|
be way better than trying to remember your passwords or, worse, re-use them.
|
||||||
|
|
||||||
|
## What I Use
|
||||||
|
|
||||||
|
If I were a sensible person, I would still be using Bitwarden. However, I just
|
||||||
|
seem to really love making my computer harder to use for the fun of it. Once I
|
||||||
|
switched to [QubesOS](https://www.qubes-os.org/) full time, I wanted to keep all
|
||||||
|
of my passwords in an offline virtual machine, which requires an offline
|
||||||
|
password manager. At this point, I switched to KeePassXC. It works very well,
|
||||||
|
and is probably the most sensible solution for most QubesOS users or those who
|
||||||
|
otherwise prefer an entirely local solution.
|
||||||
|
|
||||||
|
I stuck with KeePassXC for the entire time that I used QubesOS... until today.
|
||||||
|
In an effort to eliminate as many GUI applications as possible from my machine,
|
||||||
|
I've been occasionally thinking about other offline options that worked from the
|
||||||
|
terminal.
|
||||||
|
|
||||||
|
It wasn't until I happened to read a few blog posts by [Filippo
|
||||||
|
Valsorda](https://filippo.io/) that the idea for a real alternative began to
|
||||||
|
form. Filippo, ["a cryptography and software engineer... in charge of
|
||||||
|
cryptography and security on the Go team at Google,"](https://filippo.io/) is
|
||||||
|
the author of [`age`](https://github.com/FiloSottile/age), a file encryption
|
||||||
|
tool.
|
||||||
|
|
||||||
|
What does this have to do with password managers? At the core of every password
|
||||||
|
manager (or, at least, any password manager that's worthwhile) is some
|
||||||
|
cryptographic algorithm to take your passwords and obfuscate them so that only
|
||||||
|
you can access them. For example, Bitwarden encrypts your passwords with
|
||||||
|
[`AES-CBC`, using `PBKDF2` to derive the encryption key from your master
|
||||||
|
password](https://bitwarden.com/help/what-encryption-is-used/). You can see this
|
||||||
|
in action with Bitwarden's [interactive crypto
|
||||||
|
page](https://bitwarden.com/crypto), which I think is pretty cool.
|
||||||
|
|
||||||
|
[`pass`](https://www.passwordstore.org/) is another password manager that
|
||||||
|
describes itself as ["the standard unix password
|
||||||
|
manager"](https://www.passwordstore.org/). `pass` is actually a very clever
|
||||||
|
script run through the command line that stores passwords at `~/.password-store`
|
||||||
|
as a tree of normal directories and files.
|
||||||
|
|
||||||
|
For example, from the [`pass`](https://www.passwordstore.org/) website, it could
|
||||||
|
look something like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
Password Store
|
||||||
|
├── Business
|
||||||
|
│ ├── some-silly-business-site.com
|
||||||
|
│ └── another-business-site.net
|
||||||
|
├── Email
|
||||||
|
│ ├── donenfeld.com
|
||||||
|
│ └── zx2c4.com
|
||||||
|
└── France
|
||||||
|
├── bank
|
||||||
|
├── freebox
|
||||||
|
└── mobilephone
|
||||||
|
```
|
||||||
|
|
||||||
|
Each of those files contains [`gpg`](https://www.gnupg.org/)-encrypted password
|
||||||
|
for the website. They're accessed by using the `pass` command to decrypt the
|
||||||
|
files with a `gpg` private key. However, I strongly dislike the idea of relying
|
||||||
|
on `gpg` to protect my passwords. While I do have a PGP key, I avoid using it
|
||||||
|
whenever there's a more suitable alternative available. [Many cryptographers
|
||||||
|
have written about the issues with
|
||||||
|
PGP](https://latacora.micro.blog/2019/07/16/the-pgp-problem.html), but the
|
||||||
|
biggest concern for me is the number of foot-guns with the PGP protocol and
|
||||||
|
`gpg` tool. Even in a standard configuration like `pass`, where I'm offloading
|
||||||
|
calling `gpg` to the script, the system is just too complicated for me to be
|
||||||
|
confident in my understanding of it.
|
||||||
|
|
||||||
|
By contrast, `age` touts its opinionated nature as a feature. The lack of
|
||||||
|
configuration, secure-by-design specification, and simplicity make it, in my
|
||||||
|
opinion, the perfect encryption tool to be used with `pass`.
|
||||||
|
|
||||||
|
## Properties of a Good Password Manager
|
||||||
|
|
||||||
|
### Confidentiality
|
||||||
|
|
||||||
|
The most obviously-essential property of a password manager is to make sure that
|
||||||
|
nobody else can read your passwords. There are several types of adversary your
|
||||||
|
password manager needs to protect against, but it primarily boils down to
|
||||||
|
protecting your passwords even if someone gains access to your encrypted
|
||||||
|
password database.
|
||||||
|
|
||||||
|
You should be able to post your encrypted database on your blog or send it to
|
||||||
|
Mark Zuckerberg himself without a concern in the world. In other words, the
|
||||||
|
security properties of your database should be completely upheld by
|
||||||
|
cryptography, and not rely on more error-prone protections like storing it
|
||||||
|
offline or keeping it in a private cloud account.
|
||||||
|
|
||||||
|
### Reliability
|
||||||
|
|
||||||
|
Have you ever been unable to login to an account when you really, really needed
|
||||||
|
to? Yeah, I have. Wasn't a fun time. Passwords are so important that even the
|
||||||
|
possibility of downtime is a serious concern. Even if you can eventually recover
|
||||||
|
the data, being unable to decrypt your password database at a vital moment can
|
||||||
|
is stressful, humiliating, and potentially disastrous.
|
||||||
|
|
||||||
|
A good password manager works when you don't have internet, when your laptop
|
||||||
|
runs out of battery, when you're traveling, and when all of those are happening
|
||||||
|
at once but you have a flight to catch in an hour. You should be following (at
|
||||||
|
bare minimum) a standard [3-2-1 backup
|
||||||
|
strategy](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) -- and your
|
||||||
|
password manager should make that as easy as possible.
|
||||||
|
|
||||||
|
### Usability
|
||||||
|
|
||||||
|
Cryptography that's hard to use is worse than no cryptography at all; just ask
|
||||||
|
PGP.
|
||||||
|
|
||||||
|
If reaching for your password manager isn't the lowest-friction way of signing
|
||||||
|
up for an account, you're going to mess up and re-use a password, or make one up
|
||||||
|
and forget it. Convenience is really key here. You can have the most secure
|
||||||
|
password manager in the world, but if you can't access it on your phone, or
|
||||||
|
another computer, you'll quickly email or text a password to yourself to log
|
||||||
|
into that account you really, really need right now.
|
||||||
|
|
||||||
|
On the other hand, it also has to be extra resistant to misuse. All it takes is
|
||||||
|
saving a password unencrypted once, or accidentally typing your Master Password
|
||||||
|
into an innocuous pop-up you didn't notice, to completely compromise yourself.
|
||||||
|
|
||||||
|
### Resiliency
|
||||||
|
|
||||||
|
You aren't the only one who needs access to your accounts. Should something
|
||||||
|
happen to you, or some other unforeseen situation comes up, there needs to be a
|
||||||
|
"break glass in case of emergency" -- without compromising on the password
|
||||||
|
manager's fundamental security properties. With password managers, this often
|
||||||
|
comes in the form of some adaptation of "Emergency Access." Essentially, the
|
||||||
|
idea is to provide a trusted party or parties with enough information to,
|
||||||
|
individually or collectively, gain access to some or all of your encrypted data.
|
||||||
|
|
||||||
|
Bitwarden has the concept of "Trusted Emergency Contacts" in their ["Emergency
|
||||||
|
Access"](https://bitwarden.com/help/emergency-access/) system. Essentially, it
|
||||||
|
works by providing Bitwarden with the secret key material necessary to decrypt
|
||||||
|
your vault encrypted to the trusted contact's public key. That contact can then
|
||||||
|
send Bitwarden a "request for emergency access," after which, following a
|
||||||
|
amount of time you specify, they are sent the encrypted secret key material.
|
||||||
|
They than have access to view your entire vault.
|
||||||
|
|
||||||
|
1Password, on the other hand, lets you handle distribution of your secret key
|
||||||
|
material. They provide something they call an ["Emergency
|
||||||
|
Kit"](https://support.1password.com/emergency-kit/), which essentially is a PDF
|
||||||
|
containing your email, secret-key material, and a space to write out your Master
|
||||||
|
Password, along with instructions to begin the recovery. Unlike Bitwarden, who
|
||||||
|
acts as an escrow for your encrypted recovery data, 1Password lets you manually
|
||||||
|
distribute your recovery material. Notably, the trusted party does not need to
|
||||||
|
have a 1Password account, as the recovery material is a PDF that can be printed.
|
||||||
|
Like Bitwarden, however, once the trusted party receives the Emergency Kit, they
|
||||||
|
can then recover all of the material stored in your account.
|
||||||
|
|
||||||
|
An escrowed solution like Bitwarden is not ideal, as they potentially have the
|
||||||
|
power to withhold your secret key material (although I strongly doubt they would
|
||||||
|
ever do so unless somehow legally compelled to). The one benefit this has is
|
||||||
|
that you retain the power to prevent the secret key material from being sent to
|
||||||
|
them in the event that they try to abuse it. 1Password's PDF with a hand-written
|
||||||
|
master password seems like a better solution in terms of resiliency, but is
|
||||||
|
theoretically more susceptible to abuse. Ultimately, which of these two
|
||||||
|
solutions is better comes down to how much you trust your cloud provider
|
||||||
|
compared to how much you trust your emergency contacts.
|
||||||
|
|
||||||
|
One third way to solve this is to require multiple trusted parties to
|
||||||
|
collectively agree to access your password manager. Changing the number and
|
||||||
|
trustworthiness of those parties can help you adjust that ratio of "resiliency
|
||||||
|
against loss" to "abuse by trusted parties."
|
||||||
|
|
||||||
|
## Perfect Password Management
|
||||||
|
|
||||||
|
## Potential Improvements
|
||||||
|
|
||||||
|
### Better Secret Sharing
|
@ -0,0 +1,7 @@
|
|||||||
|
+++
|
||||||
|
template= "blog.html"
|
||||||
|
page_template = "blog-post.html"
|
||||||
|
sort_by = "date"
|
||||||
|
+++
|
||||||
|
|
||||||
|
## Blog
|
@ -1 +1 @@
|
|||||||
Subproject commit 0cd00325b3d941f208f716f24cb467fa0c03615f
|
Subproject commit 63b40ccdd689141f229fbba475cca83373f7a257
|