

There must be a “root” piece of information that unlocks all the rest.
One of the first diagrams I made when I was trying to sort this out months ago came to this conclusion. I identified 4 media that can be used to store the “root” passphrase:
- Memory
- Pencil and paper (or some other physical engraving)
- An unencrypted digital storage device
- A hardware security slot (you can configure a YubiKey to automatically type a specific password when tapped)
The last option is most appealing to me, since it doesn’t rely on memory and it’s more accessible than a USB stick, for example.
For my personal setup, I only need to update the ring 0 database when I buy a new ring 1 device, which is like once a year at most.
This is fair.
I don’t see a way around this, aside from the Qubes solution mentioned in my post.
Obviously store all your passwords on a sticky note taped to your monitor! /s
It’s unfortunate that security costs so much money. Hardware security keys are expensive, and nobody has made that ring 0 device I talked about.
If the root key is air-gapped device or virtual machine (like the Qubes password vault), then it is already 2FA.
By 2FA recovery codes, I was referring to things like this. I worded my question weird, so I apologize. Account recovery files are common, whether it’s a mnemonic seed or those 2FA recovery codes I was referring to. Those shouldn’t be stored on the same device as the password manager protecting those same accounts, so there’s no clear place to store it. You did answer my question later on, but I wanted to clarify.
As mentioned in my post, the database has the same password as the phone.
I’ll comment about this later
The duress passphrase can be stored in the ring 0 device as well, as long as you periodically revisit it to refresh your memory.
I’ll give a fun solution for this later, too.
Stopgap
I had a draft if a system, but I need more time to flesh it out. The issue with the database having the same password as the phone is that there’s only one form of authentication protecting the I spoke too soon. ring 1
credentials in that case (something you know). We have the ability here to protect it with multiple forms, and I will incorporate that into my system once I’m finished.ring 0
or db 0
is something you have, which is the second factor, as you mentioned.
As for the fun duress passphrase solution, you could put a sticky note somewhere that is essentially “PHONE PASSWORD: [duress passphrase]” to throw an attacker off and make them accidentally enter it. There’s a lot of fun and creativity to be had here. In any case, it means you don’t have to remember the duress passphrase, just where it is. “I don’t memorize the password to my phone, I store it in that safe over there.” etc.
Feel free to reply to this message, and I’ll have a working system for you (probably) in the next one.
If someone observed you entering your
ring 0
passphrase and stole your backup ofring 0
orring 0
itself, the database becomes vulnerable. For that reason, it is a good idea to encrypt your database using a different passphrase thanring 0
, and/or mitigate the risk of someone having the ability to see you type yourring 0
passphrase.Storing the
ring 0
passphrase on a hardware security key as I mentioned in the previous reply allows you to automatically type yourring 0
passphrase without the need to remember it or risk being seen typing it in. Another way to mitigate this attack would be enabling biometrics on yourring 0
device. However, that doesn’t protect seeing you type the passphrase in a BFU state.This is the method I’ve come up with:
I have a hardware security key (let’s call it
hsk 0
). It is configured to store the passphrase for my airgapped GrapheneOS phone (myring 0
device).ring 0
has biometrics enabled. This meanshsk 0
is only used to unlockring 0
in the BFU state, and can be kept in the safe otherwise. A second factor PIN can be applied toring 0
, and a copy stored in the safe. In general, the second factor PIN will be used often enough to memorize. Myring 0
has a KeePassDX database (db 0
), and Aegis for TOTP (I want to avoid the mixup of saying 2FA when I am referring to TOTP).db 0
is protected using a memorized passphrase, and also has biometrics enabled. I found that storing thedb 0
passphrase using any other medium introduces too many risks and vulnerabilities. Insidedb 0
is the duress passphrase forring 0
, as well as all device credentials forring 1
devices. The Aegis app will store TOTP for all accounts. An unencrypted backup of the phone will be made and stored in the safe.Let’s pause here and recap what would need to happen in order to obtain a
ring 1
passphrase:hsk 0
stored in your safe to unlock itIt’s important the safe isn’t stored in your home, but rather something like a safety deposit box, that way you aren’t alone near the safe at any time.
The passphrase for Aegis is stored in
db 0
, and biometrics can be enabled if you want. Eachring 1
device contains an independent KeePassXC database each, that way if a device is remotely compromised while the database is unlocked the damage is minimal. An encrypted backup server is one of thering 1
devices, which keeps all otherring 1
devices automatically backed up. All accounts are protected via 2FA (whether it’s another hardware security key (hsk 1
) or TOTP). 2FA recovery codes are stored in a safe separate from ourring 0
backup. That means TOTP follows the 3-2-1 backup method (1 copy onring 0
, 1 backup in a safe offsite, and 2FA recovery codes kept somewhere else. 3 different storage mediums)Now, what an attacker would have to do to break into an account:
ring 0
and compromise Aegis, or find the backup ofring 0
and compromise Aegis, or find the 2FA recovery codeshsk 1
(or a backup of it)Some hardware security keys allow entering a PIN before successful authentication. One of those is good as your “main”
hsk 1
, and the PIN can be stored indb 0
in case you forget (forcing the attacker to also need to compromisering 0
to usehsk 1
).I’m a bit tired while writing this, so please point out any obvious flaws. Here is a summary:
hsk 0
stores the passphrase forring 0
hsk 0
is stored in a safe (safe 0
) when not in use, and a backup can be stored in another safe (safe 1
)ring 0
has biometrics enabled, as well as a second factor PINsafe 0
ring 0
’s KeePassDX database (db 0
) stored in memorydb 0
has biometrics enabledring 0
to store all TOTP codesring 0
is stored insafe 0
db 0
stores the credentials for allring 1
devicesring 1
device is used as an encrypted backup server for all otherring 1
devicesring 1
device has their own independent KeePassXC databases (db 1
)hsk 1
) or TOTP.safe 1
hsk 1
is kept insafe 0