从11月10日开始写那个自己的“大项目”,马上要1个月了哦。这一个月怎么讲,很充实很充实…
实践证明,我的确是管得住自己的,不像某人说的那样哦。某人,你要是哪天看到了,记住我说的话,我说话是算数的。
到今天为止,已经分成了四个小工程,加起来有11000行代码了。效果还不错呢,至少理我预期很近很近。而我一般是比较乐观的,预期的标准一般都很高。
我想,寒假回了家,就可以着手写毕业论文了吧。如果这个寒假什么也没发生,等我再次回到上海的时候,毕业论文也许已经写好了。
开始流水账。按照路线图要求,昨天这个版本应当实现一个缓存管理器,目的…缓存嘛,当然是加速程序。
然而事实打击我不小。开始的时候我乐观地认为把缓存序列化在文件里面是一个优秀的设计,至少可以大量节省内存吧。在序列化的时候我还自信地使用了Gzip以便最大地节约资源。
缓存写出来之后,速度慢了100倍…

几天前在煎蛋(很意外)看到一篇文章:赶紧了,抛弃All in One SEO,因为当时也在Google阅读器,没时间仔细看,加了星标就略了过去。后来得空看了一下,里面提到All in One SEO这个WordPress插件的诸多不好,于是我试了一下…
果然All in One SEO消耗了好多资源,现在去掉All in One SEO之后的WordPress速度如飞,感觉相当好。
在此我建议,所有中文WordPress站都应该立刻禁用这个插件,因为All in One SEO给我们带来的不是SEO,而是痛苦。
如何避免禁用之后的题目变化而被搜索引擎惩罚的问题,请参阅煎蛋原文

第一个版本:

[code=’c#’]
public static byte[] Serialize(object o)
{
MemoryStream ms = new MemoryStream();
GZipStream compressedStream =
new GZipStream(ms, CompressionMode.Compress, true);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(compressedStream, o);

byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, (int)ms.Length);

compressedStream.Close();
ms.Close();
return buffer;
}
[/code]

第一个版本的问题是,buffer的长度不正确,同样的对象如果序列化到文件再读文件出来,长度总是和MemoryStream差那么十几个byte。甚是郁闷。

第二个版本:

[code=’c#’]
public static byte[] Serialize(object o)
{
MemoryStream ms = new MemoryStream();
GZipStream compressedStream =
new GZipStream(ms, CompressionMode.Compress, true);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(compressedStream, o);
compressedStream.Flush();
compressedStream.Close();

byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, (int)ms.Length);

ms.Close();
return buffer;
}
[/code]

这样MemoryStream读取出来的byte组至少在长度上正确了。但是带来一个问题,读出来的byte数组里全是0,没读到数据。Read返回也是0。

第三个版本:

[code=’c#’]
public static byte[] Serialize(object o)
{
MemoryStream ms = new MemoryStream();
GZipStream compressedStream =
new GZipStream(ms, CompressionMode.Compress, true);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(compressedStream, o);
compressedStream.Flush();
compressedStream.Close();

ms.Position = 0;
byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, (int)ms.Length);

ms.Close();
return buffer;
}
[/code]

这样终于正常了。这个事情告诉我们一下几个事实:

  • 凡是与Stream打交道时遇到的奇奇怪怪的问题多半与缓存有关,试试Flush()会有奇效。“自从缓存发明之后,计算机科学里就再也没有牛B的概念产生了。”
  • 使用MemoryStream时要打破思维定势,记得读取MemoryStream时要首先设置Position到合适的位置再读。
  • 没有做不到的事情。

[singlepic=18212,640,610]

Redmine.NET是我最近一段时间的心血。在之前我曾经写过几篇Redmine的博文,Redmine我也一直在用。现在既然DreamHost支持Ruby,何不建一个Redmine给自己管理项目呢?
一开始是这么想的,但是发现Redmine.NET域名尚未注册我立刻心动了。那段时间Godaddy被GFW掉,我冒着一定的风险用PVN连上Godaddy注册到了这个域名。真的是很难得。
做到现在也快一个月了吧,现在把自己个人SVN里面的东西全都搬进去了,感觉超方便。尤其是事情多的时候,在Issues里面自己给自己提一下,总归不会忘记的。
我给Redmine.NET的定位是“免费的项目管理平台”,目标是像SourceForge一样给开源项目提供家。不过就我自己的力量肯定是不行的,暂且先做我的项目管理系统吧。

今天在Google.cn搜索了一把“Computer Science”,得到的结果相当戏剧性。据我看,可以当做中国大学计算机专业的排名吧!
除了国内CS的老大国防科技大学不在其列,不过可以理解,军队院校嘛,保密重要。

[singlepic=18210]

这个时候是我唯一用百度的时候:和Google比较的时候。
发现百度就是垃圾。

今天寻找一个写好的MD5加密类想做个文件校验工具,在Google里搜索“MD5”看到的第一个搜索结果让我震惊:

[singlepic=18209]

这是一个提供在线MD5破解的网站!
虽然当年的山东大学副教授王小云冲上国际密码大会的讲坛公布了对对MD5、HAVAL-128、MD4和RIPEMD的破解成果后,MD5已经被认为是不安全的。不过据王小云原始算法,破解MD5至少也要比较好的计算机计算几个小时能够找出一个碰撞而已。注意,碰撞,而不是破解。用碰撞密码可以一样实现登陆,但是知道破解,就意味着拿到密码明文。相比所有人的密码多少都有那么一点点意义在里面,被人知道你使用的密码的含义和规律是多么可怕的一件事情!
这个网站,提供在线MD5破解的查询,简单说,就是已知一些密码的MD5,然后把密码和MD5一起存起来,供人查询。当人们提交的MD5足够多,或者达到覆盖大部分有含义字符串后,就达到了比较好的破解效果。

本站4T硬盘已经上线,共有MD5记录457,354,352,282条,宇宙第一,且还在不断增长中,已包含12位及12位以下数字、8位字母、全部7 位及以下字母加数字等组合,并针对国内用户做了大量优化,例如已经包含所有手机号码、全国部分大中城市固定电话号码、百家姓、常用拼音等大量组合,另加入了大型网站真实会员密码数据100万条。本站数据量大,查询速度快,同时支持16位及32位密码查询。通过对10万会员的真实动网论坛样本数据的测试,本站对于动网论坛密码的命中率达到83%。全国独此一家。另感谢一热心网友给本站奉上数百万条数据库原始密码样本,大大提高了命中率!

我来说说为什么震惊。

隐患及应用情景

网络管理员要求第一要政治过硬,他能看到很多东西,设计为人类不该看到的,但是他要禁得住这份诱惑,坐怀不乱…
但是不是每个网络管理员都是这样的人。首先我们可以相信,大型商业网站的网络管理员,在公司制度的限制下,是政治合格的。
但是在我们的生活中还是大量地用到了MD5,比如国内大部分论坛至少是Discuz和动网,这两家都采用MD5加密。论坛是如此之多,甚至不可能没有人不使用基于MD5的论坛等。一旦你的论坛注册信息出现在一个政治不可靠的网络管理员面前,问题就出现了。如果你的密码比较弱,他是可以通过在线破解查询到明文的。注意,是明文。因为找到碰撞并不是什么大事,他本身已经是网络管理员,不需要明文也能把你密码改掉,看到你在这个站的信息。
比如说,我看到123456的MD5是e10adc3949ba59abbe56e057f20f883e,于是我忍不住拿e10adc3949ba59abbe56e057f20f883e在同济网数据库里用户表里搜了一下,发现有5293个用户的密码是123456…P.S. 同济网总计233959个用户,2.2%的经典懒人。
问题是你还可能留下一个真实邮箱,或者没留下真实邮箱,但是用了“主号”当作用户名注册,这样很容易Google到你的邮箱。
虽然邮箱服务可能使用非MD5加密的形式,这样拿MD5的碰撞去登陆自然失败,问题是他拿到的是明文,这样任何加密都会失败。
一旦邮箱被攻破…基本上你在互联网的身份就已经被盗用了(告诉我你邮箱里没东西,我只能说你是土人了)。
这自然是一个严重的安全隐患吧!

个人密码的Best Practices

一个人至少有两组密码。银行卡6位数字密码那是没办法,网络上使用的密码肯定是另外一组。懒人是如此之多,以至于同一个密码到处用的人太多太多。最好的密码策略是使用分级密码,一个人应当设计至少五组密码。按照密码等级介绍如下:

  • 公用银行卡密码:对的,公用,比如这张卡你和家人一起用,这是最简单的,有意义的6位数字密码。建议用电话号码变换一下(如第二位到第七位,或第三位到第五位重复两遍),这样大家都清楚,密级也不算太低。
  • 私有银行卡密码:私房钱之类的,只有自己知道的密码。因为是6位数字,密级高不了。
  • 公共论坛注册密码:要有一定复杂度的,注册的时候尽量不用真实邮箱,必须要验证的时候用一个非主要邮箱。
  • 工作计算机密码:为什么工作计算机要单独设置密码呢?因为总有的时候,当你不在计算机旁边时,有急事发生,这时候你必须授权另外一个人打开你的计算机获取一些资料,这时候就要口述密码。建议这个密码等级不能太低(Windows域要求字母数字和符号),但是也容易记忆,而且便于口述,且与等级最高的密码生成规律不同。这样授权结束后,你可以继续按照这个密码的生成规律再生成一个新的密码即可。
  • 支付宝密码:这个密码需要一定复杂度,因为直接和钱相关。在极少的情况,这个密码也要授权给别人的。可以按照工作计算机密码等级去设置。
  • 信息中心密码:最高级的密码,这个密码管理你的个人信息中心,如QQ、主Email和个人计算机。这个密码的泄露,基本就完蛋了,别人可以伪装成你,这个问题就大了…

论坛和Email还在使用同样密码的孩子们,快改密码吧。