Alex de Sousa
Posted on March 12, 2020
Recently, I needed to reset my phone. I spent some time backing up my pictures and documents. Everything was going great. But then, I hit a roadblock.
The problem
One-time passwords have become very handy for logging into several sites from Twitter to Coinbase. This passwords are 6 digit tokens generated using the current time and a private key. I was using Google Authenticator for getting my one-time passwords. Sadly, this app does not provide a way to backup the private keys.
The damage was done. I couldn't retrieve the private keys, so I needed to regenerate all of them in every site individually. I thought about my future self dealing with the same issue and I knew I needed a sustainable solution.
The research
I wanted a one-time password solution that:
- Didn't rely on my phone or any app.
- Could also be used in my computer.
- Was offline (no private keys stored in the cloud).
That's when I discovered oathtool
: a command line tool for generating 6 digit tokens given a private key.
I installed it using
sudo apt install oathtool
Generating a 6 digit token with oathtool
is as easy as doing the following:
$ oathtool -b --totp 'MyPrivateKey'
798946
Discovering this tool was a good start, but I needed a good way of dealing with the private keys. Then I stumbled upon this article. The author created two scripts:
- One for encrypting the private key into a file using
gpg2
. - One for decrypting the private key and retrieving the 6 digit token using
oathtool
.
Additionally, the 6 digit token was automatically copied to the clipboard using xclip
.
I installed both tools by running
sudo apt install gnupg2 xclip
I loved the solution! Though it had some flaws like storing temporarily an unencrypted file with the private key, it was a great idea :)
The plugin
I wrote Oath ZSH plugin by gathering the best ideas from that article. I ended up with the following commands:
- Adding a private key:
$ oath add twitter.com
Private key:
[SUCCESS] Key created for twitter.com
- Showing a 6 digit token (it'll ask for the gpg password):
$ oath twitter.com
123456
[SUCCESS] Code copied to clipboard
- Deleting a private key (it'll ask for the gpg password):
$ oath delete twitter.com
[WARN] Deleting /home/user/.oath/twitter.com/B743BC73B5F90E2305142D226BBCD02E89ABBC79.gpg.gpg
[WARN] Deleting /home/user/.oath/twitter.com
[SUCCESS] Key deleted for twitter.com
The same private keys I added to oath
, I also added them to my phone's Google Authenticator app. That way both, my computer and phone, generate the same 6 digit token at a given time.
The only difference is that now I can backup everything. I just need to copy the following folders:
-
$HOME/.gnupg/
: GPG folder with all the gpg keys. -
$HOME/.oath/
: Oath folder where all the private keys are stored.
For more info, visit Oath Github repository.
Conclusion
Though this solution might not be for everyone, it solves the problem I had. Now I can reset my phone at any time and not worrying about my private keys, because they're safely backed up.
Happy hacking!
Cover image by Chunlea Ju
Posted on March 12, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.