这篇文章,要给NeoAtlantis应用科学和神秘学实验室新开发的服务:Password Deaddrop (密码秘密交换站)打一个广告。

我们在上网的时候,可能会需要给朋友、同事等传送一些文件或者文本。 很多这样的传送工具,比如电子邮件或者聊天软件,在隐私安全方面都不甚可靠。 如果注重这方面的安全,常见的一个方法是将文件用压缩软件做成压缩包,并设置压缩包密码。 比较靠谱的压缩软件,比如 7zip,在这样设置之后会用安全的算法,对文件进行加密。 这样实际上传送的压缩包就是经过加密的文件,即使中途有黑客截获,也无法得知其中的内容, 秘密数据就得以保证。

然而,这种做法有一个缺陷:接收文件的对方,也必须事先知道这个密码。而这个密码如何告知对方呢?

实际上,除去一些少数的情况(发送和接收双方已经事先有所沟通),要通过不安全的通信方式约定安全的密码,是一个密码学上的重要问题。 这个问题的解决办法,最安全的就是双方使用不对称加密技术,比如个人使用的 PGP 软件。 但这种软件用起来仍然有一些门槛,比如要了解基本的密码知识,而且双方还要交换自己的公钥。

这次提出的方案,是一个在可用性和安全性之间稍微折中的办法:一个提供临时密码的服务。

提供临时密码的服务

先放上网址: https://deaddrop.nerv.agency

从网页里可以看出来了,这个服务的英文名叫 Password Deaddrop。 「Deaddrop」是一个情报界的术语,过去指特工间互相约定的、用于交换情报的场所或者物品,比如一个树洞、一个墙缝那种。

我们的网站,设计思路也是类似的:

第一步:要传送文件的「发件人」,首先访问上面这个网站。 打开网页之后,就会立刻得到两个东西:绿色方框里的随机密码,和一个网址(先不要着急点开)。 这个随机密码,就是发件人可以用来加密文件的密码。对应的网址,是要分享给「收件人」的。

index

第二步:发件人把这个密码抄下来(用纸笔、复制粘贴,或者直接截屏都好)。 然后点击页面上网址旁边的复制(Copy)按钮,将网址也复制下来。

这个例子里,分享网址就是 https://deaddrop.nerv.agency/#qbcfbjswkw

第三步:用聊天软件或者电子邮件,将「网址」发送给「收件人」。

第四步:「收件人」得到网址之后,要尽快打开。这个网址只有24小时的有效期。 打开网址后,会得到一个图片(类似下图),内容和发件人见到的随机密码是一样的。 收件人也要用纸笔或者截屏的方式妥善记录下这个密码。 但因为这是图片格式,复制粘贴的办法是无效的。

retrieve

第五步:「收件人」确认密码已经妥善收到后,告知「发件人」。 这时候,发件人就可以用一开始记录的密码,将文件打包加密发送了。 而收件人也可以用记录的密码,来打开收到的压缩包。

这个服务的保密的原因,在于第四步。收件人查看密码的时候,密码也就同时在服务器上被删除掉了。 因此发给收件人用来查看密码的分享网址,只能使用一次。换句话说,在发件人将分享网址通过各种方式发送出去后,只会出现如下几种结果:

  1. 收件人收到网址,打开,看到密码。
  2. 收件人没有收到网址,或者收到后没有及时打开,超过了24小时,网址失效,服务器删除密码。 在此之后就算收件人再打开网址,也只能看到一个错误页面。
  3. 收件人收到网址之前,有黑客窃取了消息,看到了这个网址,并且尝试获取里面的密码。 服务器把密码传送给黑客,但网址只能使用一次。所以收件人再打开网址的时候,什么也看不到。

简而言之,这种分享密码的办法,原理在于“先到先得”、“阅后即焚”。不管是黑客还是预期的收件人,能看到密码的人只有一个。 所以只要收件人收到了密码,其他人就被排除在外。即使分享密码的链接作为聊天记录被永久保存,也没有关系。 读者可以试着访问下上面的网址 https://deaddrop.nerv.agency/#qbcfbjswkw,确认一下这一点。

注意事项

本文提供的这个服务,用起来有一些需要注意的地方,希望大家仔细阅读。

  1. 这个办法没有提供什么加密。这个一次性密码,在生成到被收件人获取之间的这段时间,以明文形式存储在本站的一个服务器的内存上。 虽然不会使用任何方式将这个密码写入永久存储,而且获取服务器内存中的数据也比较困难,但这不是不可能的事情。 所以,这个办法不能用于保护对安全性要求非常高的数据,只是一种临时方案。
  2. 仔细查看前面所述的使用方法(五个步骤),有两点值得注意:
    1. 收件人一定要先确认获得密码,发件人才可以开始发送。 这要求在传送数据的短暂时间里,两个人要保持沟通。 发件人不能把加密的文件和分享网址同时发送,因为如果黑客比较迅速,提前抢到了密码,那么数据就还是泄露了。
    2. 如果黑客可以冒充收件人,告诉发件人“已经妥善收到了密码”,同时把发件人自己有关“没有收到密码”的消息拦下来, 就可以欺骗发件人利用这个密码发出文件。 换句话说,本文的方法,仅仅限于黑客可以「窃听」,但不会「主动篡改、拦截」的情景 (比如,使用语音或者视频沟通就是一个很好的例子,因为黑客很难在短时间内伪造收件人的语音,冒充另一个人进行对话)。
  3. 本服务的源代码是公开的,位于 Github。 用法很简单,下载(克隆)后,用 npm install 安装依赖的包,然后 node index.js 就可以在 localhost:7100 上访问了。 熟悉配置服务器的读者,可以用这个办法搭建自己的服务器。