[Updates 2025-01-20]
The original blog post assumes that all passwords are stored in one password manager, and the password manager either unlocks everything or nothing (e.g. Keepass).
After discussing with friends, I realized that if I use something like pass, and I use a hardware GPG token, I can actually store and sync all encrypted passwords to all devices, because I will only decrypt the passwords on demand, and the computer will not see the GPG private key.
The compromise is that the computer will see the list of all password entries (e.g. accounts), as well as a few other issues.
Everything has been working fine, until I turn my paranoid knob to the max.
Here's the thought experiment.
The Imaginary Scenario
Let's say I have 100 PCs for different purposes. Among them:
- I use Google and Steam on PC 1
- I use Google and Bank on PC 2
- I use Bitcoin and Bank on PC 3
As a thread model, I'd just assume that PC 1 is filled with malicious software, which will upload everything to somewhere. I might be fine with that for Steam, but I will never use it for Bitcoin.
Now here's a question: how do I manage the passwords?
Note that Google is used by multiple PCs, if I store the password on multiple PCs, it'll be tricky to maintain it whenever the password is updated. So I should store the password on a single PC.
Also note that the scenario is the same for the Bank, so I should also pick a single PC to store its password.
Now I have to remember "Password X is stored in PC Y". This is only practical if Y is the same for all passwords, and naturally PC Y is the one with the highest security level.
Let's say I store my Google password in PC 3. How about the Steam password? I could store it on PC 1 since it's only used there, but later again, I have to remember some password is stored in PC 1 and some other password is stored in PC 3, which is not practical.
So the conclusion is: all password should be stored in the single PC with the highest security level. And we just call that PC the hardware password manager. Note that in reality it can be any suitable device, not necessarily a PC.
The Hardware Password Manager
Note that a hardware password manager has all the requirements of a software password manager, with an extra one: it can leak no information other than the requested password. This implies the device must be unlocked locally, because we cannot input the master password elsewhere.
As a bad counterexample, today, in reality I have a single database for all passwords, and I use it on all PCs, but as soon as I open it on PC 1, it will know all passwords in the database, including the master password.
Such hardware password managers are actually easy to find:
- A paper notebook
- Any air-gapped device that can run a software password manager
- Electronic password keeper/safe/vault
But I want more:
- Portable: I can carry the device on the go.
- Auto-type: I don't need to type the password letter by letter.
And there are existing nice solutions:
- Mooltipass
- OnlyKey
- Phone + InputStick
- Phone/Pi/Handheld + emulated USB/Bluetooth keyboard
- Example: Authorizer
Less relevant examples & references:
- Bluetooth Keyboard & Mouse
- uConsole
- Mecha Comet
- Comparison of multiple electornic password vaults
- How to emulate bluebooth keyboard
- https://impythonist.wordpress.com/2014/02/01/emulate-a-bluetooth-keyboard-with-the-raspberry-pi/
- https://github.com/yaptb/BlogCode/blob/master/btkeyboard/server/btk_server.py#L74
- https://github.com/Anodynous/stenogotchi/blob/main/stenogotchi/plugins/default/plover_link.py#L104
- https://github.com/bedrin/blkb
- https://github.com/SySS-Research/bluetooth-keyboard-emulator
How Can I DIY One?
If I need such a device today, I'll probably purchase one of the existing solutions.
But after reading about those interesting DIY projects, I'm also interested in thinking how I could make one myself.
Requirements
First I need to write down my reqiurements, which explain why most DIY projects are not good enough for me.
- The data is encrypted at rest.
- The device emulates a Bluetooth keyboard. Well, a USB one also works, but I guess it'll wear off too quickly.
- The device leaks nothing but the requested password.
- The device must be unlocked locally. We cannot unlock it through the PC that receives the password.
- The device is air-gapped. It have no network access.
- The device is secure from unauthorized access.
- [OPTIONAL] The device will lock itself after a few falseful attempts.
- [OPTIONAL] The device is somewhat resistant against tampering. E.g. someone steals my device, modifies the software then secretly puts it back.
Hardware
Mostly I'm thinking of Raspberry Pi, which may be the regular ones, or Pi Zero, because they have a nice ecosystem of accessories. Alternatively, phones, handhelds and Arduino etc can also work.
The device will need its own display and input, which could be something like a Game HAT, or a touch display. And I will need more components:
- Case
- Battery
- USB cable
- NFC
I also want a Yubikey for unlocking the device and the database.
Software
- Surely I'll install Linux, likely Debian. And I'll have to maintain/upgrade the system completely offline. There is apt-offline for this purpose.
- I'll use LUKS, which can be unlocked by a hardware token using systemd-cryptenroll.
- The passwords will be encrypted by GPG, because I want to unlock it using Yubikey.
- I could just use pass
- Or I can juse KeepassXC, while encrypting the master password with pass.
- It should be relevant easy to emulate a USB or Bluetooth keyboard, especially on a Pi.
- I'll need some UI to display the status.
- This probably requires some work.
- I'll need to input some PINs, using the touch display or buttons.
- This probably requires some work.
Conclusion
Maybe one day I'll be way more paranoid, I don't trust my devices and I don't trust commercial hardware password managers. In that case I'll likely start building something on my own.
But before that, I'd like to just keep it as a long-running fun thought experiment.
Comments