加密的正确打开方式

161 阅读5分钟

本文共计1950字,阅读时间5分钟左右

图片

Zoom正在使用端到端加密?

2020年疫情期间,Zoom的使用量激增,但随即暴露出一些安全问题。特别是Zoom声称自己使用了“端到端加密”(图1),却能让一些传统视频终端无缝接入Zoom会议室,而这些终端明显不支持加密视频流,这引起了安全领域人士的广泛质疑。

图片

图1:Zoom程序声称正在使用端到端加密

之后Zoom的首席产品官Oded Gal发表了一篇博文(blog.zoom.us/facts-aroun…

如图2,一个“普通”的Zoom会议,看上去完美地符合端到端加密的定义:在一个客户端加密内容,在另一个客户端解密,服务商完全不知道通信的内容。

图片

图2:当所有接入者都是Zoom客户端

Gal的原话是:

To be clear, in a meeting where all of the participants are using Zoom clients, and the meeting is not being recorded, we encrypt all video, audio, screen sharing, and chat content at the sending client, and do not decrypt it at any point before it reaches the receiving clients.

然而我们机智地发现,Gal的用词是“do not”而不是“can not”。什么什么?一个采用端到端加密的系统,难道需要依赖于运营者的主观意愿来保证用户的内容隐私吗?果然,图3说明,在“特殊”情况下,也就是当有传统终端需要接入时,会议内容会在所谓“Zoom Connector”节点上被解密,且以明文方式传输。

图片

图3:当传统终端接入Zoom会议

如果应用说:您的数据已加密……

看到这里,我感觉Gal玩了一个不太高明的概念偷换。打个比方:假如你要邮寄一份重要文件,你当着快递小哥的面把文件装进保险箱,上了锁;然后小哥一路送件;最后,收件的小伙伴打开保险箱,取出文件。这看上去似乎挺“端到端”的:一端上锁一端解锁,不是吗?

但设想一下,假如保险箱是快递小哥给你的,钥匙也要交给他一路带过去,他在中间做了什么,你完全不知道,这样你还会觉得安全吗?

图3就是这样,让你使用Zoom提供的密钥,在“需要”的时候,Zoom把保险箱打开,好心帮你“润色”了一下机密文件,使其更易读。但,这是你想要的吗?

当然,Zoom仍然不失为一家令人尊敬的技术公司,他们用后续的实际行动补上了这个漏洞,具体可参考其白皮书: github.com/zoom/zoom-e…

我们用这个例子只是想提醒读者, “加密”是一个容易被滥用的概念。当一个应用声称自己对用户数据加密,它实际的做法可能有以下三种:

  • 客户端加密,服务端解密:这实际上只是利用了传输层的安全性,如SSL或TLS,保证在传输链路上,无人可以访问加密内容。然而服务器是直接在明文上进行逻辑处理的,无法保证在处理过程中内容不被泄露。
  • 客户端加密和解密,但密钥由服务器分发:上节所述Zoom的加密策略就是这种情况,服务器保留了解密的可能性,你得相信它的操守。
  • 客户端加解密,客户端分发密钥:这需要为每位用户提供公私钥对,用公钥加密,再用私钥解密(注:考虑到公私钥算法的复杂度,更好的做法是先用对称密钥加密内容,再用公钥算法加密对称密钥)。这就杜绝了服务器私自解密的可能,因为它不知道用户的私钥。

显然,只有最后一种,才可以认为是比较安全的。但其实也还有一些坑,比如私钥一般难以记忆,应用可能会主动“帮助”用户存储私钥。那么被存储的私钥有没有可能被不当使用呢?很难说。

 “私钥的保存是个比较大的话题,我们将再开一文深入讨论。”

再比如,当内容的发送方和接收方不是同一个人时(例如文件共享或聊天消息),发送方需要知道接收方的公钥。公钥交换问题一直是公私钥算法的一个难点,设计得不好就容易遭受中间人攻击。举个例子:

  1. 小明和翠花在老王开发的“巨信”App上注册了账号,并且各自保存好了私钥。
  2. 老王想偷听他俩的聊天,作为开发者,他私自偷换了“巨信”后台小明和翠花的公钥。
  3. 翠花拿到了“伪·小明”的公钥,将消息加密后通过“巨信”发送。
  4. 老王手里有“伪·小明”的私钥,可以解开这条加密消息,再用“真·小明”的公钥加密。
  5. 小明拿到信息后还可以正常解密,无法发现在途中已经被人窃听。

图片

图4:集中式身份认证遭遇中间人攻击

总结

所以,不能简单把“数据加密”和“安全隐私”划上等号。一个应用只有做到了如下几点,才值得信赖:

  • 身份天然与公私钥对绑定。
  • 真正的端到端加密:
    • 内容加密,密钥在客户端生成,通过公私钥算法分发。
    • 没有私钥,则任何人无法解密内容(也包括服务器)。
  • 服务器不保存私钥,或者只保存私钥的加密版本。
  • 允许分布式的身份认证,以避免中间人攻击。