151 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| After having tested countless messaging apps over the years, being
 | |
| unsatisfied with most of them and finally getting stuck with
 | |
| [Telegram](https://telegram.org/) I have developed a little theory about
 | |
| messaging apps.
 | |
| 
 | |
| SMU stands for *Security*, *Multi-Device* and *Usability*. Quite like
 | |
| the [CAP-theorem](https://en.wikipedia.org/wiki/CAP_theorem) I believe
 | |
| that you can - using current models - only solve two out of three things
 | |
| on this list. Let me elaborate what I mean by the individual points:
 | |
| 
 | |
| **Security**: This is mainly about encryption of messages, not so much
 | |
| about hiding identities to third-parties. Commonly some kind of
 | |
| asymmetric encryption scheme. Verification of keys used must be possible
 | |
| for the user.
 | |
| 
 | |
| **Multi-Device**: Messaging-app clients for multiple devices, with
 | |
| devices being linked to the same identifier, receiving the same messages
 | |
| and being independent of each other. A nice bonus is also an open
 | |
| protocol (like Telegram\'s) that would let people write new clients.
 | |
| 
 | |
| **Usability**: Usability is a bit of a broad term, but what I mean by it
 | |
| here is handling contacts and identities. It should be easy to create
 | |
| accounts, give contact information to people and have everything just
 | |
| work in a somewhat automated fashion.
 | |
| 
 | |
| Some categorisation of popular messaging apps:
 | |
| 
 | |
| **SU**: Threema
 | |
| 
 | |
| **MU**: Telegram, Google Hangouts, iMessage, Facebook Messenger
 | |
| 
 | |
| **SM**:
 | |
| [Signal](https://gist.github.com/TheBlueMatt/d2fcfb78d29faca117f5)
 | |
| 
 | |
| *Side note: The most popular messaging app - WhatsApp - only scores a
 | |
| single letter (U). This makes it completely uninteresting to me.*
 | |
| 
 | |
| Let\'s talk about **SM** - which might contain the key to solving SMU.
 | |
| Two approaches are interesting here.
 | |
| 
 | |
| The single key model
 | |
| --------------------
 | |
| 
 | |
| In Signal there is a single identity key which can be used to register a
 | |
| device on the server. There exists a process for sharing this identity
 | |
| key from a primary device to a secondary one, so that the secondary
 | |
| device can register itself (see the link above for a description).
 | |
| 
 | |
| This *almost* breaks M because there is still a dependence on a primary
 | |
| device and newly onboarded devices can not be used to onboard further
 | |
| devices. However, for lack of a better SM example I\'ll give it a pass.
 | |
| 
 | |
| The other thing it obviously breaks is U as the process for setting it
 | |
| up is annoying and having to rely on the primary device is a SPOF (there
 | |
| might be a way to recover from a lost primary device, but I didn\'t find
 | |
| any information so far).
 | |
| 
 | |
| The multiple key model
 | |
| ----------------------
 | |
| 
 | |
| In iMessage every device that a user logs into creates a new key pair
 | |
| and submits its public key to a per-account key pool. Senders fetch all
 | |
| available public keys for a recipient and encrypt to all of the keys.
 | |
| 
 | |
| Devices that join can catch up on history by receiving it from other
 | |
| devices that use its public key.
 | |
| 
 | |
| This *almost* solves all of SMU, but its compliance with S breaks due to
 | |
| the fact that the key pool is not auditable, and controlled by a
 | |
| third-party (Apple). How can you verify that they don\'t go and add
 | |
| another key to your pool?
 | |
| 
 | |
| A possible solution
 | |
| -------------------
 | |
| 
 | |
| Out of these two approaches I believe the multiple key one looks more
 | |
| promising. If there was a third-party handling the key pool but in a way
 | |
| that is verifiable, transparent and auditable that model could be used
 | |
| to solve SMU.
 | |
| 
 | |
| The technology I have been thinking about for this is some kind of
 | |
| blockchain model and here\'s how I think it could work:
 | |
| 
 | |
| 1.  Bob installs the app and begins onboarding. The first device
 | |
|     generates its keypair, submits the public key and an account
 | |
|     creation request.
 | |
| 
 | |
| 2.  Bob\'s account is created on the messaging apps\' servers and a
 | |
|     unique identifier plus the fingerprint of the first device\'s public
 | |
|     key is written to the chain.
 | |
| 
 | |
| 3.  Alice sends a message to Bob, her device asks the messaging service
 | |
|     for Bob\'s account\'s identity and public keys. Her device verifies
 | |
|     the public key fingerprint against the one in the blockchain before
 | |
|     encrypting to it and sending the message.
 | |
| 
 | |
| 4.  Bob receives Alice\'s message on his first device.
 | |
| 
 | |
| 5.  Bob logs in to his account on a second device. The device generates
 | |
|     a key pair and sends the public key to the service, the service
 | |
|     writes it to the blockchain using its identifier.
 | |
| 
 | |
| 6.  The messaging service requests that Bob\'s first device signs the
 | |
|     second device\'s key and triggers a simple confirmation popup.
 | |
| 
 | |
| 7.  Bob confirms the second device on his first device. It signs the key
 | |
|     and writes the signature to the chain.
 | |
| 
 | |
| 8.  Alice sends another message, her device requests Bob\'s current keys
 | |
|     and receives the new key. It verifies that both the messaging
 | |
|     service and one of Bob\'s older devices have confirmed this key in
 | |
|     the chain. It encrypts the message to both keys and sends it on.
 | |
| 
 | |
| 9.  Bob receives Alice\'s message on both devices.
 | |
| 
 | |
| After this the second device can request conversation history from the
 | |
| first one to synchronise old messages.
 | |
| 
 | |
| Further devices added to an account can be confirmed by any of the
 | |
| devices already in the account.
 | |
| 
 | |
| The messaging service could not add new keys for an account on its own
 | |
| because it does not control any of the private keys confirmed by the
 | |
| chain.
 | |
| 
 | |
| In case all devices were lost, the messaging service could associate the
 | |
| account with a fresh identity in the block chain. Message history
 | |
| synchronisation would of course be impossible.
 | |
| 
 | |
| Feedback welcome
 | |
| ----------------
 | |
| 
 | |
| I would love to hear some input on this idea, especially if anyone knows
 | |
| of an attempt to implement a similar model already. Possible attack
 | |
| vectors would also be really interesting.
 | |
| 
 | |
| Until something like this comes to fruition, I\'ll continue using
 | |
| Telegram with GPG as the security layer when needed.
 | |
| 
 | |
| **Update:** WhatsApp has launched an integration with the Signal guys
 | |
| and added their protocol to the official WhatsApp app. This means
 | |
| WhatsApp now firmly sits in the SU-category, but it still does not solve
 | |
| this problem.
 | |
| 
 | |
| **Update 2:** Facebook Messenger has also integrated with Signal, but
 | |
| their secret chats do not support multi-device well (it is Signal
 | |
| afterall). This means it scores either SU or MU depending on which mode
 | |
| you use it in.
 | |
| 
 | |
| An interesting service I have not yet evaluated properly is
 | |
| [Matrix](http://matrix.org/).
 |