MD 5/ SHA1 等Hash算法的正确是用问题.
开这个帖子的目的,是希望大家能够对使用Hash算法有一个正确的认识.并且回复一个叫作 Hozaka朋友给我留言的问题,以及他对MD5算法的一些认识. 也可以说是对我之前一个帖子后续.
原贴地址:
http://community.csdn.net/Expert/topic/4069/4069250.xml?temp=.9598657
首先感谢Hozaka以及其他朋友对我的原帖的支持.
我在这里再重申一边,Hash的算法不管是SHA1还是MD5,是用来保证数据完整性的
而不是用来保证数据机密性的.Hozaka在给我的留言中提到的一个例子,用一个key对数据加密,然后用这个key对数据解密.(这个是他人为的加密和解密)
这个例子里面说到的话题属于对称密钥加密算法的范畴.对称加密有对称加密的弱点,就是Key一旦泄密,则被这个Key加密的信息的机密性也就从此打破了,因此这里涉及到Key Management的话题.(这个话题也太大了,这里不做进一步解释了)
要实现数据机密性的需求实际上和Hash算法没有非常直接的关系. Hash算法,不管是MD5还是SHA1并没有什么真正意义上的key,算法都是公开的,这些算法的特点是不允许逆运算.其产生的效果好比在传统现实中我们对一份合同书进行签名,签名之后这份合同书就不允许修改了,那么使用了电子化以后我们怎么保证这一点呢? 因此发明了Hash算法来保证这一点. 举个例子来讲:
比如你用Word 写了一份合同书Email给对方,然后用Hash算法对这个整份的合同书进行编码. 编码结果是你得到一个固定长度的字符串,而且这个字符串代表了原始这封合同书上的每一个字符. 这个就是电子化意义上的数字签名. 有了这个东西,不关这份合同书在哪里,我只要有前面通过Hash算法生成的摘要信息,我就可以在任何时候判断出这份合同书是否被修改过. 这就是Hash算法的设计初衷. 由此我们可以看出, Hash算法没有任何机密性可言. 他仅仅是用于保证原始数据一旦生成就不允许修改. 这里体现数据完整性.
因此,在CSDN上的很多人用Hash算法,比如MD5 来保证数据的机密性,比如用于对数据库中保存的密码数据进行加密,其做法是不恰当的.希望大家看了这些以后能够对Hash算法有一个新的认识,并且能够正确的使用Hash算法.
如果大家有问题欢迎给我发送留言.我也很乐意回复.