关于 Dropbox 共享文件夹安全性的技术探讨
# 感谢读者 plusium 这篇很有技术含量的投稿,原载于他的博客。
本文将从纯技术的角度,分析一下热门的云存储同步工具 Dropbox 共享文件夹的权限设置及其安全性,即在已经公开了某一文件夹链接的情况下,其他非公开文件夹的安全性。这里以首次安装后系统自动生成的 Photos 文件夹为例。当然,类似“如果这么担心安全性的话,就不要往 Dropbox 上放啊”这样的话,不用说我也知道。
我们知道一个 Photos 文件夹的公开共享链接是大约这样子的:
http://www.dropbox.com/gallery/9628444/2/_wallpaper/_other?h=8a53e8
其中 [9628444] 是用户ID,[2] 是文件夹的深度,[_wallpaper] 是一级文件夹名,[_other] 是二级文件夹名。[h=8a53e8] 是一个校验码,用于保证只有知道这个地址的人才有权限访问这个文件夹。其中的这个 [h] 很可能是指 [hex] ,表示是16进制的意思。
一般情况下,没有链接地址,其他文件夹依然是不可访问的,其中校验码起了很大的作用。
用一个6位的十六进制数进行权限控制,看起来应该很安全,不太可能有人误打误撞进了你的相册。
暴力穷举破解也似乎不可行。假设有人知道了你的用户ID和文件夹名称(在本文上述前提下,其他人会知道你的用户ID,和文件夹的命名规则,可以很容易猜测出其他文件夹的名称,或者穷举文件夹名称),那么想要穷举这个校验码,需要最大尝试 16,777,216 次。实际上由于最高位不可能是0,那么最大就需要尝试 15,728,640 次。而 Dropbox 会在连续尝试失败若干次之后暂时封锁来自该 IP 的访问,所以暴力破解不太可行。
那么我们来看看这个校验码的生成有没有什么规律。按最安全的方案的话,Dropbox 应该在每个文件夹创建时随机生成一个校验码。通过以下实验可以发现,校验码不是随机生成的。
假设校验码是随机生成,那么我们在 Photos 下面创建一个名为 [test] 的文件夹,如果分别在客户端和 Web 端创建,校验码应该会不一样。
我们将 Dropbox 客户端的代理服务器设置为一个不存在的代理,令 Dropbox 处于离线状态,这样可以保证 Dropbox 客户端程序在生成校验码时不与服务器交互。然后在本地和 Web 端分别创建 [test] 文件夹并获得共享链接,发现两个链接的校验码是一样的。这足以说明,校验码不是随机生成的。
而这两个分别生成的校验码一样,是不是因为校验码是和路径有关的呢。我们把 [test] 改名为 [test1] ,发现校验码变了,说明校验码是和路径有关的。
那么校验码和用户 ID 有没有关系呢?用不同的用户登录 Dropbox 同样创建 [test] 文件夹并获得链接,发现校验码不一样,所以校验码是和用户 ID 有关的。
设计上也应该是这样,否则我只要自己也创建一个一样路径的文件夹,就能得到其他所有人的这个文件夹的校验码了。特别是在每个人都有 [Photos] 这个根文件夹的情况下,这点尤其重要。
这个根文件夹虽然看似不提供共享链接,但是有用于通知图片更新的 Feed 地址,可以用来反推共享链接。而且这个feed地址或者共享链接一旦泄漏,那你的所有相册就相当于完全公开了。因为有某文件夹访问权的人,也有它的子文件夹的访问权。如何获得 Photos 根文件夹的 Feed 地址,在我的上一篇文章(blogspot)里有介绍。
既然校验码不是随机生成,那么次级安全的生成方案,就是令校验码和用户密码之类的挂钩了。
经测试,校验码和用户登录名以及密码均无关。那么按我的想象,只有两种可能性了。1、为每个用户分别随机生成一个永久的密钥,令校验码和这个密钥有关。2、所有用户使用同一个密钥。
安全性上肯定是第一种要高,以 Dropbox 的技术实力来看,我们应该相信他们是采用了第一种方案。如果用的是第二种方案的话,那么一旦将来这个唯一的密钥以及加密方法泄露出去,事情就大条了。而且考虑到 Dropbox 的某些技术人员肯定会知道这个密钥,为了限制技术人员的访问权,Dropbox 决策层也应该会采用第一种方案。
虽然有数据库查看权限的技术人员也能查到单个用户的密钥(这个密钥由于和用户密码无关,肯定不是加密存储的),但我们应该也没必要担心这一点,毕竟我们的文件都存在人家的服务器上,他们要想访问,那还不是轻而易举。
顺便一提,我的个人观点,不管其他文件夹的文件是否使用了 AES-256 加密存储(他们宣称的,但这个加密据我猜测,应该不是使用用户密码进行加密的。从可以通过文件的 MD5 指纹或者 SHA-1 指纹进行文件去冗余存储处理,也可以看出文件不是使用类似上述的用户密钥进行加密的。而是使用一个公共密钥进行加密的。但是,没有使用用户密码作为密钥进行的加密,对用户来说都是相当于没有加密。当然使用用户密码作为密钥加密,安全性是最高,但是实用性不够。因为如果那样做的话,只要用户一修改密码,那所有的文件都需要拿出来重新进行加密。关于 Dropbox 的加密方法,我这边还会继续关注,有这方面消息的人请务必留言讨论一下。),但 [Public] 和 [Photos] 这两个文件夹的文件肯定没有加密存储,因为没有加密的必要。考虑到效率,也不应该加密。
只要保证这些文件是不可浏览的(not browsable)和不可搜索的(not searchable),就可以认为文件是安全的了。不知道他们的权限管理和 Google 比怎么样,不要出现像之前 Google 工程师查看用户私人数据这样的事情才好。
写了这么多,结论就是文件目前是安全的,链接没有公开的相册,别人是怎么也看不了的。想看看有没有人有更深入的分析,所以稍微写一些,也就是抛一块烂砖,看能引出块玉来不。
Update 1:
逛了一圈 Dropbox 的官方论坛,发现 Dropbox 的确是用一个公共密钥来加密所有文件。
参考 http://forums.dropbox.com/topic.php?id=25288&replies=7#post-159350 。
既然文件都是用一个公共密钥加密,那么前面提到的共享链接的校验码肯定也是用一个公共密钥了。至于这两个密钥是不是同一个,似乎就不那么重要了。泄漏了任何一个,对dropbox而言都将是毁灭性的打击。
实在不放心人家的安全性的人,建议用 Dropbox + TrueCrypt 的组合方案。这个方案下 Dropbox 的一大特性——差分同步——是否还有效就不知道了。具体请自行 Google。
另外还有一个据说是真正的本地加密(可设个人加密密钥)、云端存储的产品,在 idrivesync.com。我没实际验证,有兴趣的可以去看看。
Update 2:
国内有不少出售或转让 Dropbox 账号的,我要给大家一个警告,由于文中所述原因,转让 Dropbox 账号是很危险的行为。
因为即使更换了账号对应的 E-mail 地址和密码,原始 Photos 文件夹的分享链接和验证码是不会变的。前账号所有者保存下这个链接(如果他知道的话),然后将账号转让出去,下一个所有者的 Photos 文件夹及其子文件夹的所有图片将可以一览无遗。
我建议,不要将这个链接保存在任何地方,不要用任何在线或离线的RSS阅读器订阅自己的 Photos 文件夹更新,最好是自己永远不要去获取这个链接。连你都不知道了,别人就更加无法知道了。
不过大家放心,如果你的账号就是从别人手中转让过来的也不用太担心,因为在我写这段文字之前,我想全国没(几个)人知道这件事。(@XDash 吐槽:好吧,现在全国有不少人知道了 — —+)
一切打算利用该“feature”进行非法、非道德用途的人,请停止这个想法。因此产生各类法律或者非法律的问题,本人一概不负任何责任。若因本文影响到你的淘宝上的生意,请自己承担后果。