网站地图    收藏   

主页 > 后端 > PHP语言 >

hash加密

来源:未知    时间:2014-11-06 15:33 作者:xxadmin 阅读:

[导读] 看看现在的论坛,99%的都有对密码加密,而且有很多采用的是md5方法。在早期,有人说md5加密方法是最安全的,因为它不能解密,这是确实的,但是有没有方法比md5方法更加具有安全性...

看看现在的论坛,99%的都有对密码加密,而且有很多采用的是md5方法。在早期,有人说md5加密方法是最安全的,因为它不能解密,这是确实的,但是有没有方法比md5方法更加具有安全性呢?当然有,今天我就要介绍一种另外的加密方式:hash方法。这个方法是我在web wiz guide站点上发现的,经常逛国外网站的朋友可能听说过web wiz guide论坛,hash加密方法,就是从web wiz guide论坛中分离出来的。

传统的md5方法就是几个函数的组合,最终调用这句话就实现加密了:md5(encodestr),其中的encodestr与md5(encodestr)是一一对应的,也就是说一个encodestr对应一个md5(encodestr)。而hash方法却不是一一对应的关系,而是一对多的关系。之所以是一对多的关系,就是因为加密方法与md5不同。

让我们看一个例子:
当我们用md5方法加密"111"这个字符串时,我们调用的语句是:
md5("111")
结果是:
698d51a19d8a121ce581499d7b701668
但是我们用hash方法加密"111"这个字符串时,我们调用的语句却是:
hashencode(getsalt(len("111")) & "111")
结果是:
6FCD9AA863A4934929684D092C1EF0364687A1DE,
97E8F16623A0AF64B48FF1CEF6558C8E1D12C94E,
F77F2148F82C342A7971F25D7BA3760AE71AB9BA,
.
.
.
.
.
.
因此,hash方法是一对多的。

在hash方法中,我们先对要加密的字符串的长度执行一个getsalt函数,它的具体作用就是根据要加密字符串的长度生成一个随机的salt值,这个salt值的长度与要加密的字符串的长度是相等的,比如我们调用如下函数:
getsalt(len("111"))
结果是:
4CD
9B7
9A6
.
.
.
.
.
然后我们再将这个salt值与要加密的字符串结合并且用hashencode函数执行,因此,加密后的字符串是任意的,比如我们要将"111"这个字符串加密,实际上我们是在加密4CD111,9B7111,9A6111...........因此hash方法是一对多的关系。那么怎么才能让hash方法向md5一样一对一呢?很简单,比如用户在论坛中注册时,我们要对他的密码进行加密,当用户提交表单后,我们可以将随机生成的salt值
getsalt(len(encodestr))

hashencode(getsalt(len(endodestr)) & encodestr)
值都存入数据库中,当我们验证用户时,我们可以先从数据库中把salt值读出来,然后与用户登陆时提交的密码结合执行hashencode函数,如果执行结果与数据库中的值相同,则通过验证,否则不通过。

这就是hash方法,不知道大家看懂了没有。

简单的说,单从md5函数和hashencode函数来说,除了加密算法不一样,其他都是一样的,都是单向加密,不能解密。但是hash方法并不是像md5方法那样直接加密字符串,而是先对字符串进行一些处理,然后再加密。这个先做的处理就是根据要加密字符串的长度生成一个随机salt值,然后用这个salt值与要加密的字符串一同进行加密,并且把salt值与一同加密后的值都存入数据库中;在验证上,md5方法是将用户提交的字符先进行md5加密,然后与数据库中加密后的字符相比,如果相同则通过验证,否则不通过验证。而hash方法则是先从数据库中读取salt值,然后用salt值与用户提交的字符相结合进行hash加密,再与数据库中的加密后字符比较,相同则通过,否则不通过。

其实如果我们说md5是一次加密里最具有安全性的,那么我们可以说hash方法是对一次加密的又一次加密,也就是说是二次加密。因此从理论上来说比md5方法更加安全。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论