In my previous post I mentioned using BitTorrent Sync (btsync) to be able to share private git repositories without GitHub, or any server at all.
I've ran into some bugs with btsync that have been troublesome, but my biggest issue with it is that it is closed source, so its security cannot be easily audited.
To make things worse, the protocol that it uses isn't documented publicly (at time of writing).
Other solutions, such as Dropbox, Skydrive, and Google Drive have full access to your data.
SpiderOak Hive and SpaceMonkey are also closed source.
Say goodbye to the cloud and hello to clear skies
Over the weekend I set out to create my own solution, called ClearSkies.
My proposal is to create an open-source solution with a protocol that is well documented. Hopefully the protocol can be reused by other implementations (even closed-source ones) that need two-way sync.
In picking the features that the first version of the protocol should support, I feel like it's necessary to at least have feature parity with other solutions, since otherwise it will be hard to attrack the initial set of users. The bare minimum feature set necessary to have parity with btsync:
- Read/write syncing
- Read-only syncing
- Encrypted over the wire
- Simple key sharing
There are a few other features that I'd like to add. Some btsync users have asked for in the forums is the ability to sync encrypted versions of the files to an untrusted computer (such as a virtual machine).
This "untrusted" support can be extended in a simple way to support widely distributed backup to many machines. Instead of making this peer-to-peer with the entire population of the Internet, it will support "peer groups", which mean that you can choose which people you want to do a backup with. For example, a good group of people to use would be your extended family, assuming that some of them are geographically dispersed.
Doing cryptography right is hard. My plan is to try and use known cryptography primitives in conventional ways whenever possible. The technologies I plan on using are the following:
- AES for encryption
- RSA for signatures
- SHA256 for hashing
- CTR mode for encrypting files
- TLS's PSK mode for communicating
- TLS's DHE mode for perfect forward security
The hope is that as the project reaches maturity that someone will look at it and point out any flaws with how the security is implemented. If this happens, then the primary reason for starting this project will have been justified.
My plan is to take the following course of action:
Create the protocol.
Create a reference implementation of the protocol. This would probably only have a command-line UI.
Attempt to publicize the existence of the project and see if there is enough interest to make a GUI. (A good name for the GUI might be SkyBox or DropDrive.)
Extend the protocol to allow for fully-distributed webapps, chat, and email.
So far I'm about halfway through step one. You can see the protocol draft on github. Interested parties are welcome to contribute.