页面

2011年1月17日星期一

关于Dropbox的Photos文件夹的安全性

关键词:Dropbox, Photos, Security, 权限, 安全性

本文是要分析一下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”进行非法、非道德用途的人,请停止这个想法。因此产生各类法律或者非法律的问题,本人一概不负任何责任。若因本文影响到你的淘宝上的生意,请自己承担后果。

使用Facebook社交插件参与评论:

2011年1月15日星期六

使用dropbox管理wallpaper

关键词:dropbox, wallpaper, RSS, John’s Background Switcher, cloud, 壁纸, 墙纸, 桌布, 自动切换, 云计算

    如果你和我一样下载了很多漂亮的壁纸图片的话,一定也很在意图片文件的备份问题和占用硬盘空间问题。我介绍一下我的做法,大家看看觉得这样o不ok。

    壁纸的用途,就是要显示到windows(其他操作系统没用过,不熟悉)桌面上,令工作学习之余看看放松心情。而平时一般不会去打开壁纸文件夹一张一张去看的。如今云计算乃是大势所趋,所以如果能把壁纸都存在云端,然后使用支持从云端读取图片的自动切换壁纸的软件进行自动壁纸切换的话,那么既可以空出部分硬盘空间(本地尽量不存储个人数据,为将来的完全云计算做准备),也不必担心万一电脑被盗数据丢失,另外还可以做到令壁纸自动更换免去手动更换的麻烦。这么一想,好处那是太多了。所以我花了不少时间在寻找这样的一个解决方案。最近,总算找到了近乎完美的方案。这个方案要用到2到3款工具软件/服务,先一一简单介绍一下。各软件的使用技巧不在本文讨论范围。

1,用于保存壁纸的在线图片存储服务,dropbox

大名鼎鼎的跨平台文件同步软件,并且提供云端的存储空间。这里不多介绍,可以去 同步控 搜索相关文章进一步了解。想要注册的话,点 我的这个邀请链接 注册可以给你我双方各加250M-500M的在线存储空间。当然这一类的软件/服务还有很多,如何选择一款好的软件/服务,特别是云计算服务的话,那么服务的稳定性是一个很重要的因素。当今要论云计算,Google、Microsoft、Amazon乃是3大广为人知的云计算巨头,服务的稳定性那是没得说。不比其他的小公司,说不定哪天就倒闭了。当然除去这三家,其他颇具规模的云计算服务也不少,但如果这三家中有提供类似服务的话,我会优先考虑这三家的服务。而实际上今天要说的这个解决方案,这三家都有可用的服务。Google的是PicasaWeb,微软有Skydrive,而dropbox虽然不是Amazon家的产品,但是用的是Amazon的云计算平台,而且最近这家公司发展势头似乎不错,再加上其他的一些优秀的功能,完全可以和Google、微软的服务一较高下。加上其他的一些产品,这里列一个表格来比较一下流行的几款软件/服务的差异。

服务名 运营商 免费在线存储容量 在线查看图片 支持RSS订阅图片更新 描述
PicasaWeb Google 1G 可 是 非常优秀的在线相册,只是免费空间有点小
Skydrive Microsoft 25G 可 是 在线相册的管理不方便
dropbox dropbox 2G或更多 可 是 完全符合我的要求。通过邀请注册,存储空间可以最大达到18G以上。而且有时候会做活动赠送存储空间。
SugarSync SugarSync 5G或更多 可 是 在线文件夹的组织、管理方式不太方便

其他还有Facebook、Flickr、photozou等可以选择,不一一介绍。

2,自动切换壁纸的windows程序,John’s Background Switcher

    用过不少自动切换壁纸的软件,最终发现还是这个最强大。支持图片来自本地计算机、PicasaWeb、Facebook、Flickr、RSS源、Google图片搜索结果等等,可以设置定时切换、随机切换,可以设置壁纸的显示方式(平铺、居中等一共9种模式,这一点其他很多软件都有缺陷),设置的选项也非常丰富,总之可以满足我的对于设置壁纸的一切需求。不过有两点不太好的地方,第1,软件的运行需要计算机安装有.net Framework。第2,用于访问网络的代理服务器功能,软件仅支持HTTP代理,不支持SOCKS代理。第1点问题也不大,因为从Windows Vista开始已经内置了.net Framework。还在用XP的赶紧升级吧。第2点据说和第1点有关,我专门去官方论坛问过作者能不能让软件支持SOCKS代理,作者说.net不支持SOCKS代理,他也没办法。但是作为一个.net程序员,我对此表示怀疑,大约搜了一下似乎并没有那么回事,.net应该是支持SOCKS代理的。具体还需要进一步调查。

3,代理软件

    在中国大陆,以上许多服务都不能用。如果想用dropbox、PicasaWeb、Flickr、Facebook,则需要另备代理软件。这个自行解决,本文不作推荐。

 

    有了以上的软件,就可以开始我们愉快的云壁纸生活了。以下分步说明。

1,将壁纸放入dropbox的根文件夹Photos

*支持子文件夹、多文件夹

*如果你的没有Photos这个文件夹,则应该在web管理页面添加这个文件夹,注意首字母需要大写。具体看 这里

2,在dropbox的web管理页面,点击壁纸所在文件夹右边的箭头并选择以Gallery方式打开这个相册的在线浏览模式。如果你的浏览器有自动检测feed功能,那么会检测到这个页面有这个相册的RSS更新feed。复制下这个feed地址。如果没有检测到,那么查看这个页面的源文件,搜索“rss”也能找到。还没找到的话,只好用一些非常规的办法了。在本地硬盘中定位到壁纸文件夹,右击这个文件夹,会有一个dropbox关联菜单。选择里面的“Copy Gallery Public Link”可以得到这个相册的共享地址。把地址中的“gallery”替换成“photos_rss”,就是这个相册的feed地址了。

    我在Photos下面建了一个文件夹“_wallpaper”,又在里面建了一个子文件夹“_other”,得到这个相册的feed地址是这样的:http://www.dropbox.com/photos_rss/9628444/2//_wallpaper/_other?h=8a53e8

*这个地址也可以用https开头的地址,但有些代理可能不支持https协议

*注意feed地址有一处有两个斜杠“/”。而使用非常规方法得到的feed地址同一处只有一个斜杠,如果一个斜杠无效的话,试试改成两个斜杠。

3,如果有多个文件夹需要配置,重复上一步。

4,将这些feed地址作为RSS photo feed加入John’s Background Switcher中,设定好间隔时间,就可以了。

5,壁纸全部上传完毕之后,可以在dropbox中设置为不同步壁纸文件夹。设置之后dropbox会删除本地的壁纸文件夹,节省了本地硬盘空间。以后想再往这个文件夹添加文件时,可以先添加到其他文件夹,然后在web管理界面将这些文件移动到壁纸文件夹中。

 

后记:1,关于选择一款好的软件,网上有人说的好:一款优秀的软件在于,你在使用它,但是你感觉不到它的存在。像dropbox、John’s Background Switcher都属于这一类。

2,关于dropbox的Photos文件夹的安全性,我接下来会专门写一篇文章来分析。

使用Facebook社交插件参与评论:

2010年12月29日星期三

某厂商的产品推广活动中的漏洞

关键词:数论 概率 双色球

近日某国内IT厂商为推广旗下新产品,推出了一个活动,内容如下:

大奖第二波:新浪微博前1200名粉丝随机抽奖规则
12月28日还会产生第二位幸运大奖!为了能够取得一个公平的随机数,我们将采用12月28日晚21点30分开奖的双色球号码(http://www.zhcw.com/ssq/index.shtml)作为基数除以1200,得到的余数将作为获奖粉丝的号码(注:如果余数为0,则第1200位粉丝将获奖)
以下是前1200名粉丝名单:
....

我专门去了解了一下规则。双色球的奖是由6个红球和1个蓝球组成。其中6个红球是从01号到33号这33个球中随机选择6个球并从小到大排序。蓝球是从01号到16号这16个球中随机选择1个球,排在6个红球的后面。像上文所提到的12月28号的奖是这样的:

这样的规则下选出来的号码(4091721253101)由于各个位置上的数字不是完全随机,那么除以1200之后的余数当然也就不够随机了。说什么“一个公平的随机数”,该厂商一直给人很严谨的感觉,却犯了这么一个低级的错误。


为了证明我的推理,特别计算了一下号码中各位数字对余数的影响力。也就是将某个位上的数字从0变到9,看看余数将做出什么样的变化。


我们以号码00,00,00,00,00,00,00为起点进行分析,这个时候余数为0。当个位数从0开始每增加1时,余数也增加1。说明个位数对余数的影响是“+1”。同理,十位数对余数的影响是“+10”,百位数是“+100”,千位数是“+1000”,万位以后都是“+400”。因为是求余,有可能某位数增加的过程中,余数会因为满1200而减少,所以实际中各位数对余数的影响如下表所示:

位 影响
个 +1,-1199
十 +10,-1190
百 +100,-1100
千 +1000,-200
万 +400,-800
以下同 +400,-800

可以看出,对余数的个位数和十位数能施加影响的,只有号码的后两位可以做到,而且是后两位直接复制到余数。号码的后两位是什么数,余数的后两位就也是什么数。而号码的后两位是一个蓝球,它只能是1-16中的一个数值。显而易见,粉丝号码不满足这个条件的,当选的概率就是0了。

不仅如此,由于百位以上的数字变化也不是完全随机,那么剩下的这些满足条件的号码的概率也都是不相等的。由于各数字的变化非常微妙,单独纯理论计算各余数的出现概率似乎不太可行。我们借助计算机来模拟一下双色球的号码并计算号码除以1200所得各个余数的概率。

写计算机程序模拟演算之前,为了简化运算,我们有必要将模型简化一下。由于后两位是1-16的完全随机,对于(mnxy)型的余数,显然(mn01),(mn02),・・・,(mn16)的概率是一样的。所以我们只需要考察红球区的号码除以12所得余数的概率就可以了。

C#代码如下:

using System;
using System.Collections;

public class SimSSQ
{
[STAThread]
static void Main(string[] args)
{
//各余数的命中次数数组
int[,] probs = new int[,] {
{0,0},
{1,0},
{2,0},
{3,0},
{4,0},
{5,0},
{6,0},
{7,0},
{8,0},
{9,0},
{10,0},
{11,0},
};

//循环次数 1千万次 执行时间大约10秒
int rootTime = 10000000;

//随机数发生器,对于这次的应用,该发生器可以视为完全随机的
Random random = new Random();
long redNum;
int yu;

for (int i = 0; i < rootTime; i++)
{
//得到一个红球号码
redNum = getRedNum(random);

//求余
yu = (int)(redNum % 12L);

probs[yu, 1] = probs[yu, 1] + 1;
}

Console.WriteLine("余数\t命中次数\t概率");
for (int i = 0; i < 12; i++)
{
Console.WriteLine("{0}\t{1}\t\t{2}",
probs[i, 0], probs[i, 1], (float)probs[i, 1] / (float)rootTime);
}
Console.ReadLine();
}

//随机获得一个红球号码
private static long getRedNum(Random random)
{
//红球
int[] redBalls = new int[] {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33
};

//循环6次取6个不同的球 这个循环的方法很精巧 是从网上搜到的
int[] ballsGet = new int[6];
int index = 0;
for (int i = 0; i < 6; i++)
{
index = random.Next(0, 33 - i);
ballsGet[i] = redBalls[index];
if (index < 33 - i - 1)
{
redBalls[index] = redBalls[33 - i - 1];
}
}

//排序
int temp;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5 - i; j++)
{
if (ballsGet[j] > ballsGet[j + 1])
{
temp = ballsGet[j];
ballsGet[j] = ballsGet[j + 1];
ballsGet[j + 1] = temp;
}

}
}

return ballsGet[0] * 10000000000 + ballsGet[1] * 100000000
+ ballsGet[2] * 1000000 + ballsGet[3] * 10000 + ballsGet[4] * 100 + ballsGet[5];
}

}
 
  代码中循环1千万次来模拟1千万个号码,费时大约10秒。以防万一,将程序运行3遍,结果如下:
第一次运行:

余数 命中次数 概率
0 901619 0.0901619
1 1092387 0.1092387
2 601096 0.0601096
3 737644 0.0737644
4 900792 0.0900792
5 1094439 0.1094439
6 601951 0.0601951
7 739544 0.0739544
8 899516 0.0899516
9 1090694 0.1090694
10 602235 0.0602235
11 738083 0.0738083


第二次运行:


余数 命中次数 概率
0 900673 0.0900673
1 1090294 0.1090294
2 602277 0.0602277
3 741315 0.0741315
4 900915 0.0900915
5 1090490 0.109049
6 600926 0.0600926
7 739800 0.07398
8 901101 0.0901101
9 1091689 0.1091689
10 600657 0.0600657
11 739863 0.0739863


第三次运行:


余数 命中次数 概率
0 900186 0.0900186
1 1092241 0.1092241
2 601803 0.0601803
3 736812 0.0736812
4 901554 0.0901554
5 1092559 0.1092559
6 602827 0.0602827
7 738813 0.0738813
8 902931 0.0902931
9 1093280 0.109328
10 600721 0.0600721
11 736273 0.0736273


可以看出,三次运行结果高度一致。从运行结果上推断,(00xy),(04xy),(08xy)的概率相等,应该是0.09附近,(01xy),(05xy),(09xy)的概率是0.11附近,(02xy),(06xy),(10xy)的概率是0.06附近,(03xy),(04xy),(11xy)的概率是0.074附近。如果有概率方面的高手能手动计算出这个概率值,请务必让我景仰一下。


结语:厂商预期每个粉丝的当选概率都是1/1200即0.000833。从上面的分析看来,粉丝号段是101-116,501-516,901-916的人当选概率是最大的,达到了0.00683,几乎是预期值的10倍。而实际中是号码为1101的人获得了这个奖项,正是上面说的那期号码(4091721253101)除以1200的余数。

使用Facebook社交插件参与评论:

2010年11月30日星期二

Windows Live Sync即将终止服务

Windows Live Sync(目前版本号2008 内部版本14.0)是一个优秀的在线同步软件及服务。由于正在被新的Windows Live Mesh所代替,服务将于2011年初停止。它兼具以下几个方面的功能甚至没有其他软件可以代替(包括新的Live Mesh):
1,自动同步。实时监控文件系统的变化。
2,同步双方必须都同时在线,以做到不经第三方中转的英特网上的p2p加密传输,增强了安全性。
3,同步过程中可以查看到精确的进度。
4,支持的windows版本广泛,只需要一个软件和一个Live ID即可实现。不需要ftp,webDAV等服务作为前提。

与此同时也有些缺点:
1,同步过程中无法暂停同步。
2,文件冲突时不能设置自动的冲突解决方案,必须每次手动选择方案。
3,当修改了同步文件夹中一个软链接文件夹(mklink)里的文本文件时,似乎有时候捕捉不到变动而不进行同步。
4,同步过程中,会将文件锁定,不允许其他应用程序访问,甚至不允许删除文件。

而新的Live Mesh和Live Sync比较,有以下优点:
1,可以选择点到点同步或者云端同步。点到点同步和Live Sync一样。如果选择云端同步,那么需要同步的双方将不必同时在线。文件将在云端保持最新。
2,2011年以后也能继续提供服务。

但是也有如下关键的不足:
1,无法查看精确的同步进度,只能看到大概的剩余同步文件数。当只同步单个大文件时,进度将完全无法掌握(间接方法:可以使用流量监控软件监控程序从同步开始时的上传流量,再配合已知的文件大小从而推断同步进度,有点麻烦,希望后续版本能够改进)。
2,仅支持Windows Vista以上版本的系统,而且对系统的SP补丁要求较高
3,内存资源占用相对较大
4,有和Live Sync的缺点1一样的缺点。是否还继承了其他缺点还有待观察。

我仔细试用过以下软件,发现都不是Live Sync的理想替代品:
1,Dropbox,SugarSync,Syncplicity一类基于云存储的服务
2,Good Sync,Allway Sync,SyncToy一类基于点到点的服务
3,金山快盘,DBank一类国产服务

转载一张别人画的Live Mesh配图以充分了解优点1:
原图来自:http://www.cnblogs.com/xyrein

使用Facebook社交插件参与评论: