Paperback: An encrypted paper-based backup scheme
github.com
github.com
If this is your will, you can give 3 shards to your sister (that you trust absolutely) and requires 4 shards to decrypt it. Your "semi-trusted" friends needs to be 4 to decrypt it, but your sister only needs to know one of your friend to access.
Written in rust for extra HN creds /s
I like this project and gives me some ideas on how to enhance my solution. Thank you!
But if you've figured out how to get even more density without making it difficult to practically read the data from the document I'd be very happy to hear about it and would gladly switch to that instead.
I have a few questions about that.
1. Would that link even work after 10 or 20 or 30 years? What’s the fallback if the link is broken?
2. Is the “latest version” always guaranteed to be compatible with the scheme used by the document in question (again consider that the document is created now but is being attempted to be recovered a few decades from now)?
3. Based on the above questions, what’s a reasonable expected age for this system to work (I’m referring to the software)?
It would be useful to have these questions and their answers added in an FAQ on the site and in the repo.
1. My original plan was to have a textual description of the algorithm that you could print out and store with the key shards or main document. That way even if GitHub goes down and Rust is no longer available you could still pay someone to re-implement the algorithm to reconstruct the secret. That document could also contain a minimal version of the source code to just reconstruct the secret. The reason for putting a link to the website was so that a regular user (who is ultimately going to be the target audience for this) would be able to follow the instructions to recover the secret.
2. All of the data has a u32 version number inside the wire format, so any change which would render things incompatible would result in a new version and the code for recovering the old version would remain untouched (and once we get to that point, there would be tests to make sure that works). Also the document says in the header which paperback version was used to construct it, so even in the extreme case where we wouldn't be able to detect a change we could just ask the user what version of paperback does the document say.
3. Good question, but I'm not sure how I would go about estimating this?
I will add some of this information to the README.
Now I can get the base64-strings from the qr-codes, but it's not clear how to pass this to paperback to decode the main document.
At the moment you need to do the following (and the recovery procedure is a bit cumbersome -- there will be a GUI at some point for all of this since ultimately the project is intended for regular people):
% paperback backup [- or the file to back up] -n [threshold] -k [number of shards to make]
The command will print out the contents of the main document QR codes since at the moment the program can't scan the QR codes in the PDFs so you need to manually input the data. Note that the QR codes don't contain Base64 since that is not an efficient way of encoding binary data using QR codes. The QR code data is all encoded in Base10 (but the recovery code can handle any base data because I use multibase[1] prefixes).
And then to recover:
% paperback recover --interactive [- or the path to output the data to]
And it will ask you for the main document data (just copy-paste it, putting an extra newline after each segment) and then the shard data (you can copy-paste the "text fallback" segments from the QR codes) and shard codewords -- also with a newline after each section section. The prompts tell you what to input
"paperback expand" (create new shards from existing ones) works the same way (and also requires --interactive).
I plan to add support for just taking the PDF file and scanning the data from it directly but it seems a bit complicated to do at the moment, and I'm presenting a talk on this project next month at Linux.conf.au so I'm working on that talk right now.
The short version is you should use archival grade acid-free paper (acid breaks down ink and the page over time) and prefer encapsulation (storing inside an intert sleeve with the end taped or threaded closed) over hot lamination (the vinyl acetate in the laminate accelerates degredation).
We have managed to keep documents much older than 100 years in usable condition under far less ideal circumstances.
Something as important and as a will probably shouldn’t be encrypted in this fashion. Something more analog would be better.
I’m not sure if my descendants would appreciate having to compute Shamir and some key derivation function by hand just to read my will, but at least I could give complete instructions that aren’t bound to some vintage program that may or may not still be on GitHub in 75 years.
As for whether you should use this as a will -- I suspect you don't want to use this as your entire will (I'm not even sure if it would be legally enforceable in every jurisdiction -- the laws surrounding wills are quite complicated).
However, if you have some kind of digital asset that would be unsafe to include unencrypted in your will (cryptocurrency wallet keys are the obvious example but there are others) then this would be a supplement to your will. In addition, this program is also solving the issue that you want to have a backup of some sensitive data but not require you to have a long key that you will struggle to remember for decades.
[1]: https://en.m.wikipedia.org/wiki/ABC_(programming_language)
I think any description of the algorithm at all would be better than the current "go to the website and download the latest version" situation. It should be enough to say which algorithms you use and the order. It looks like you've picked common enough ones that they shouldn't be lost to history.
> Another thing to deal with is what if QR codes are no longer used in 50 years time?
I'd imagine that many hundreds of years from now there will still be enough artifacts with QR codes on them that some historian will know what they are and how to decode them. They're far too common to be so easily forgotten, I think.
Maybe down the road instead of hiring a locksmith to crack your grandpa's safe, you'll hire a cryptosmith to crack into their paper wallet.
I'm slightly more worried about encoding and the wire format of the various bits of data stored in the QR codes. You'd need slightly more detail than just the algorithms used. For the record, the entire design is actually outlined here[1] in lots of detail so really all that would be necessary would be encode that document as a PDF you can print and store with the backups.
[1]: https://github.com/cyphar/paperback/blob/main/DESIGN.md
Ultimately doing both is probably better than one or the other.
:)
[1]: https://en.m.wikipedia.org/wiki/ABC_(programming_language)