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