传统上,电子邮件等异步消息传递系统依赖于 PGP 或 s / mime 等协议来实现加密安全。 这些协议的工作方式基本是这样的: 希望接收加密电子邮件的人发布一个公钥,需要发送加密电子邮件给那个人的人们使用这个公钥对邮件内容进行加密。
虽然这样做是有效的,但这意味着每次任何人向给定的收件人发送消息时,该消息都一遍又一遍的使用收件人的相同公钥进行加密。
如果攻击者在一段较长的时间内记录了攻击目标的所有密文流量,然后在未来的任何时候破解这个密钥(也许通过侵入目标所在的设备) ,他们就有能力解密之前记录的所有属于攻击目标的密文信息。
诸如 OTR(Off-the-Record Messaging) 之类的现代加密协议通过使用临时密钥交换来解决这个问题。 与其总是使用同一个静态公钥,不如在对话中协商一个临时密钥。由于这些密钥交换是临时的,记录密文通信对于潜在的攻击者没有帮助,因为没有固定的密钥供它们在未来去破解。 即使你的设备被破解了,设备上也没有任何密钥来帮助攻击者解密之前交换的密文。 这种特性通常被称为完备的前向安全性(Perfect Forward Secrecy
)。
OTR 是为同步传输而设计的。 它适用于桌面即时通讯客户端,但在异步通信特征明显的移动环境中就不一定那么好用了。为了发送消息,应用程序首先需要完成密钥交换。 然而,在一个无法保证迅速作出反应的移动世界里,要完成一次密钥交换,就要一个发送密钥交换信息和等待响应的一个完整过程。如果密钥交换请求信息不能得到及时响应,用户就无法发送真正要发的正文信息出去。
这里有个简单的技巧,在提供前向加密的同时提供异步消息传递。就是用户在登录应用时预先生成100个签名密钥交换消息,并将它们发送到服务器。我们称这些消息为 “prekeys”,这是另外一个用户要发送加密信息给该用户时,就可以做下面的事情:
- 连接到服务器并请求目标用户的下一个"prekey"。
- 生成自己的密钥交换消息的一半。
- 用它接收到的“prekey”和它自己的密钥交换信息的一半来计算一个共享密钥。
- 使用共享秘钥对消息进行加密。
- 将 prekey id、本地生成的密钥交换消息和密文打包,将它们一起发送到目标客户端。
目标客户端将接收到的所有这些信息作为一个推送通知。 当用户点击它时,客户端拥有计算共享密钥所需要的所有密钥交换信息,可以立即计算出共享密钥并解密密文信息。
对用户来说,他几乎感受不到这个密钥交换过程,可以随时发送信息出去。由于服务器不会两次发出相同的“prekey”(客户端也不会两次接受相同的“prekey”) ,因此我们就能够在完全异步的环境中提供前向加密了。
网友评论