分类: C/C++
2006-08-18 16:38:30
Hash算法不管是MD5也好SHA1也好. 他们都是一种散列算法,其算法的特点是,可以把任意长度的字符串经过运算生成固定长度的字符串,并且这个产生的字符串代表着原来字符串里的所有字符。简单的举个例子:
admin 加密后:
16位8f00b204e9800998
32位d41d8cd98f00b204e9800998ecf8427e
其中不管是16位也好,32位也好其生成的字符串8f00b204e9800998 (16bit)或者d41d8cd98f00b204e9800998ecf8427e(32bit)他们表示着admin这个原始字符串.只要 admin这个字符串没有变,不管怎样重复使用MD5或者SHA1进行重新运算,其结果保持不变。
利用这个特点,在计算机安全学上,我们使用这种算法来保证数据完整性(Integrity),这里提到计算机安全学,我在这里扩充一下:简单的 概述计算机安全学,其实就是一门在讲关于 CIA的学科。 C = Confidentiality (机密性), I = Integrity (完整性), A = Avalibility(可用性)。
显而易见Hash算法,是用来保证 Integrity的算法。什么叫做完整性,不单单指数据不丢失,并且要保证数据没有被非法修改过。举个简单的例子。比如:A 发了一个Email给B内容为"Hello",因为我们目前使用的以太网的特点,任何人在网络上都有可能截获这封Email,任何人都有可能,修改 Hello这个字符串。那么当B收到这封A发来的Email的时候,怎么确定这封Email在传送过程中没有被修改过呢? 我们就使用了Hash算法来保证数据的完整性。他的工作方式是这样的:
1.A写一封Email内容为Hello
2.A用Hash算法对Hello进行编码(这里我用了编码,没有用加密这个词)
3.A将原始Email Hello 以及经过Hash算法编码过后的digest(原始Email的摘要信息)一起发送给B
(因此,A给B发的Email由2部分组成,1是原始的Hello,2是经过Hash编码的摘要信息)
4.B接收到了A的Email,首先分离由2部分组成的邮件。
5.B通过Hash算法,根据收到的Email的内容,重新计算出该Email的摘要信息.
6.B将自己计算出的摘要信息和收到的摘要信息进行比较,如果比较结果一样,则认为这封Email在中途没有被修改过,否则的话,这封Email在中途一定被修改过,因此内容不可信。
至此,保证了原始数据的完整性。
很多人在使用Hash算法在对密码进行所谓的加密,其实是不妥的。这样做的最终结果最多最多就是能够让使用的这个软件的人放心。放心什么呢?放 心的就是他们在你的软件里面所保存的密码,开发软件的人不能获得。除此之外,没有其他任何价值。如果一定要说出其他的价值的话。也就是如果开发软件的人员 或者维护该软件的人员不小心将含有客户密码数据的数据库泄密的话,得到这个数据库的人,无法从数据库中获得那些客户的密码。 但是,大家想想清楚,我都获得了数据库的数据,我还需要那些密码干什么呢?
我相信很多在CSDN的开发者,他们为了实现向客户承诺的所谓的 Pravicy,他们在开发Web base应用的时候,使用了Hash算法。这样他们会对使用他们Webbase的应用的用户说:"你们在我这里的登陆密码是安全的,没有人能够知道。" 看上去好像想得很周到,其实,仔细想想,光光使用这种方法,如何保证用户的Pravicy呢? 说白了,就是形同虚设,光光使用Hash算法对用户的密码进行编码(所谓的加密)是没有什么很高的价值的。
谈了这么多,我相信大家应该理解Hash算法的用途了。现在我们来简单的谈一下,很多人很为之骄傲的山东大学王小云教授的关于什么MD5"解密 "的新闻.(根据我刚刚看了山东大学的网页,据说她连SHA1,MD4都"解密"了). 请大家注意,我在解密上面放了引号!!
如果网上这么传,我只能说那些报道这则消息的新闻工作者的无知!(当然不能怪他们,因为他们不是计算机专业毕业的,而且报道的又是有关计算机安 全学方面的东西。要知道在美国计算机安全学,是可以单独作为大学本科的一个专业的,里面有太多的东西需要学了。我现在讲得也只是皮毛而已。)有点跑题了……
回过头,简单的讲一下王教授的碰撞法。 说到解密?王教授的方法不是用来解密的。所以传什么王教授可以解密MD5,将MD5的编码(所谓的加密)结果还原,这个是有点夸大了。没有这么传神的,那些说法用句时髦的话来描述叫做“传说中的解密”。
王教授的碰撞法是利用了MD5或者SHA1算法的一个漏洞(我暂且叫做漏洞吧,没有考证过),根据MD5和SHA1这种Hash算法的特点,因 为他们是任意长度的字符串变成固定长度的摘要信息。那么这里就有可能发生一个问题,就是不同的字符串在理论上是有可能产生相同的摘要信息。
王教授所谓的碰撞法,碰撞的就是不同的字符串所产生的摘要信息是一样的那些字符串。因此得名碰撞法。 碰撞就是体现在这里。没有什么其它的传神的东西了。根据SHA1和MD5等Hash算法,在设计时候,设计这个算法的人认为不同的字符串要产生相同结果的 摘要信息的可能性几乎为零。而王教授则证明了SHA1和MD5等Hash算法产生的摘要信息规则是可以在比较短时间内被破解的。这样一来,原始数据的 Integrity 就被打破了。 所谓的破解,也就是体现在这里。
如果大家还不明白,我再简单的用王教授的碰撞法给大家举个简单的例子。
还是拿我前面的例子,A给B写了个Email叫做Hello,然后通过王教授的碰撞法,可能得到Fuck这个字符串的摘要信息和Hello这个 这个字符串产生的摘要信息是一样的。因此,在前面的这个例子中。如果B收到的Email内容为Fuck B也将认为是A发来的Email,并且没有被修改过!
看到这里,我相信很多目前在使用MD5或者SHA1等Hash算法的人来保证密码安全的人来说,应该考虑一下,是否应该继续使用目前的方法来保证安全了