可能以前的文章讲得不够简单,hash算法其实就是将一段非常长的数据通过hash变换为一个固定长度相对较短的数据,简称“摘要”,你可以理解成把一本书通过hash变成一段很短的话,算法最关键的要点是,哪怕你改动了这本书里面的一个标点符号,hash后的摘要都会改变。(累死我了,我发现说大白话讲技术问题挺难的)
以MD5这种hash算法为例,他可以将任意长度的数据变成128位的散列值,所谓任意长度的意思就是你的数据可以是一篇文章,一部电影,或者只是一个字母,哪怕是个空字符串,下面这个就是MD5一个空字符串后的值:
MD5("")= d41d8cd98f00b204e9800998ecf8427e
这个例子只是说明hash可以将任意长度的数据变为一个固定长度的值,算法的精妙在于这个值对于不同的数据还是不一样的,如果不同的数据生成的hash值一样,就是有名的“hash碰撞了”
其实hash适合于比较大的数据做摘要,不能作为加密使用,很多误传为MD5加密,也有人称之为单向加密,就是指不能通过hash后的值不能推导原来的数据,这种说法不够严密,比如很多网站喜欢将用户的密码经过MD5变换后存储,主要防止数据库泄露后直接查看用户的密码,真正密码比对时对用户输入的密码进行md5变换然后和存储的md5值比较
从密码学上讲加密过程都要对应解密过程,即可以通过密文还原明文,所以以上的密码保护方法不是严格意义上的数据加密解密。
对于以上方法,一般采用md5字典进行暴力解密,只需要对原有的密码字典进行MD5变换,然后进行字典比对,不会增加太多的计算复杂度,比如你看到d41d8cd98f00b204e9800998ecf8427e这个值就知道代表的是一个空字符串。