Open Source Applications Foundation

[Dev] Automatic secure email

Andy Hertzfeld Wed, 06 Nov 2002 11:52:47 -0800


I wrote up some ideas about automatic secure email in a paper posted on 
our website at http://www.osafoundation.org/automatic_secure_email.htm . 
 I'm also including it below.  Please let us know what you think.

-- Andy

-----------

    Even though secure email technology has existed for decades, and 
many email clients currently support it, the vast majority of email 
messages sent today still travel through the network in plain text, 
naked to the scrutiny of observers on the networks they pass through.  
What are the reasons for this? How can we improve the situation?

One reason is that security features are often complex to configure and 
administrate, especially for non-technical users who are unfamiliar with 
the underlying concepts.   Many users don't value security highly 
because they don't understand the nature of their vulnerabilities.  Even 
if you are technically inclined and concerned with security, you can't 
adopt secure email all on your own, since your correspondents must, too, 
if you want to continue to communicate with them.

    So widespread use of secure email won't occur until it is adopted by 
a critical mass of mainstream users, and most mainstream users won't 
start using it until it is just as convenient and easy to use as the 
alternative.  Widespread use of secure email won't really happen until 
commonly used mail clients deploy it automatically, by default, with 
minimal configuration required.  That certainly seems like a worthy goal 
for Chandler.

    The problem is that you can only send an encrypted message to 
someone who has set up secure email themselves and somehow made you 
aware of their public key, as well as knowledge of the particular 
formats they accept.  Cryptographic key pairs are too complex for 
ordinary users to manage manually.  There are also complications 
involving trusting that a given key is authentic.  And even if you know 
a correspondent's public key, they might be receiving your message with 
an alternative client (perhaps a hand-held device) that uses a different 
key or doesn't support secure email.

In order to be able to automatically send messages securely, we need a 
way for our mail client to automatically determine the relevant public 
security information for each recipient.  One possibility is for each 
client to register their public security information with a server, 
which could be queried by other clients before sending. However, that 
information could get out of sync with the client, and we prefer a 
solution that doesn't require additional servers if possible.

A better approach is to define a simple mechanism for email clients to 
communicate with each other directly, via email itself, so they can 
share descriptions of their capabilities, including the cryptographic 
information necessary to talk to them in a secure fashion.  With such a 
mechanism, your email client could negotiate with your correspondent's 
client behind the scenes, to determine the best way to send a message 
securely.

Let's examine what such a mechanism would look like, without trying to 
specify it formally here.  We can define a new, RFC822-style email 
header called 'X-Profile-Request', which is used to request a profile 
from the receiving email client.  When an email client receives a 
message that contains a profile request header, it responds with a 
'profile response', which is an email message containing an 
'X-Profile-Response' header and the responding client's profile 
contained in xml file attached to the response.  The profile includes 
the types of encryption algorithms and formats supported by the client 
with their corresponding public keys, as well as a user-agent string, a 
list of supported mime-types, and possibly other descriptive information 
like contact info expressed as a vcard.
   
Clients must guard against revealing too much information to arbitrary 
requesters, since you don't necessarily want to even reveal your 
existence to spammers or unknown parties.  Profile requests contain a 
request identifier, generated by the requester, which is included in the 
profile response to help verify its authenticity; this helps guard 
against trouble-makers providing false keys in phony responses. In order 
to help protect ourselves against evil-doers sending out large numbers 
of profile requests, we also require a profile request to include a 
hash-cash string, which is a string containing numbers that are easy to 
verify but are relatively hard to compute.   Still, some users will wish 
to approve all profile requests explicitly, so there should be a user 
interface for dealing with them, perhaps integrated with instant 
messaging presence subscription requests.

    An email client will remember the results from prior profile 
requests, so it will usually only have to send one the first time you 
communicate with someone new, or when you explicitly decide to 
resynchronize (It can also issue them behind the scenes when you add a 
new contact).  When the user sends a new message, the client will look 
up profile information for the recipients.  If present, the profile 
information allows the client to send the message securely; if it's not 
present, the client will include a profile request in the message, so it 
can send it securely the next time. Alternatively, at the user's 
discretion, it could just send a profile request with an empty message 
the first time, and wait for the profile response so it doesn't have to 
send the message insecurely the first time.

    Another complication arises from users having more than one email 
client for the same email address.  We either need a mechanism for 
clients to synchronize their private keys (which might not be advisable, 
since it's hard to do securely), or to allow each client to have its own 
key pair and support multiple profiles associated with a given email 
address. In that case, when a client issues a profile request, it might 
get multiple responses, one from each recipient client that received the 
request.  Then, when sending a message, the client must include multiple 
versions of the encrypted session key, one for each profile on hand for 
the designated recipient.  There are some nice benefits for supporting 
multiple profiles per address that go beyond security, as it could be 
used to avoid sending large attachments to hand-held clients, for example.

In order to turn on encryption by default, we must be able to deal 
gracefully with the situation when someone receives a profile request or 
an encrypted message with a client that doesn't know how to handle it.  
There should be a simple way for recipients to notify senders that they 
received an encrypted message that they can't decode, and to request an 
unencrypted version.  Encrypted messages could contain a brief, plain 
text message in the body area to explain what to do in the case.  One 
possibility is for the recipient to reply with an empty message, and 
have our client recognize that and treat it specially, offering to send 
an unencrypted version.

    We are interested in your feedback about the approach outlined 
above.  Is automatic encryption as described above a worthwhile goal, or 
will it cause more trouble than its worth, especially during the early 
stages of adoption.  What can be done to ease the transition?

    Other open issues include determining the structure of the profile 
and what information it contains.  Hopefully, we can leverage xml to 
allow an extensible framework, where clients can include optional 
information in custom namespaces.  Is requiring a hash-cash puzzle in 
the request worthwhile or is it adding too much complexity?  What kind 
of algorithm should it use?
   
We're also interested in an analysis from a security point of view.  
What kind of attacks is our scheme subject to, and what can we do to 
remedy them?  Is there anything we can do to make "man in the middle" 
attacks harder?