Encrypting the chain #43
Replies: 2 comments 4 replies
-
Another reason for wanting to encrypt the chain: if an attacker can get hold of the public key that is part of a Seitan invitation, and if the space of possible invitation tokens is sufficiently small, the attacker could run an offline attack to brute-force all the possible invitation tokens to find the one that corresponds to the public key on the chain, and hence gain access to the team. Encrypting the public key on the chain prevents this attack without having to resort to excessively long invitation tokens. (An existing member of the team could still try this attack, but that seems like a lower risk than an attacker who is not a team member.)
I'm not sure what you mean with this exactly, but it sets off alarm bells. In the past, encryption and authentication sometimes got conflated, but in modern cryptography they are considered two very different things. |
Beta Was this translation helpful? Give feedback.
-
Most of the work to encrypt the chain will take place in the CRDX repo. I've stubbed out a PR there as a container for this work, and I've added some notes on implementation. http://github.com/HerbCaudill/crdx/pull/6 |
Beta Was this translation helpful? Give feedback.
-
Why?
So far we’ve been treating the chain as if anyone might see it. Any secrets on the chain are encrypted before they go on the chain: For example, any secret keys that are shared on the chain are first encrypted into lockboxes. Everything else is stored and shared in plain text.
However, the chain contains a lot of metadata — personal identifiers, device identifiers, timestamps, etc. Anyone with access to the chain would know exactly who belonged to a group at any point in time, what privileges they have, and so on.
It would be very convenient to be able to use completely untrusted infrastructure for transmitting and storing the chain. If the actual links on the chain were encrypted, we could sync up using untrusted relays, and we could back up the chain onto publicly visible key-value storage, without worrying about leaking this metadata.
How?
Here’s one possible approach:
We asymmetrically encrypt the body of each link, using the author’s private key and the team’s public key.
This would eliminate the need for a signature on each link, since the encryption provides authentication.
If a link rotates the team keys (going from generation i to generation i+1), we encrypt it using the previous team keys (generation i).
Same thing if a link rotates the author’s keys.
(Note that this doesn’t prevent us from recovering from a key compromise. Remember, the new team keys themselves are encrypted for each member in lockboxes.)
When a new member is admitted, in addition to receiving the (encrypted) chain, they would separately receive a lockbox containing
the generation 0all generations of the team keys, as well as the founder's public keys.Beta Was this translation helpful? Give feedback.
All reactions