理解php Hash函数,增强密码安全

理解php Hash函数,增强密码安全

用户输入用户名和密码;

程序将密码通过以注册相同的hash函数进行加密;

程序从数据库查到用户,并读取hash后的密码;

程序比较用户名和密码,如果匹配则给用户授权。

如何选择合适的方法来加密密码,我们将在文章的后面讨论这个问题。

4.问题1:hash碰撞

hash碰撞是指对两个不同的内容进行hash得到了相同的hash值。发生hash碰撞的可能性取决于所用的hash算法。

如何产生?

举个例子php try throw catch,一些老式程序使用crc32()来hash密码,这种算法产生一个32位的整数作为hash结果,这意味着只有2^32 (即4,294,967,296) 种可能的输出结果。

让我们来hash一个密码:

echo crc32(”);

// :

现在我们假设一个人窃取了数据库,得到了hash过的密码。他可能不能将还原为‘’,然而他可以找到另一个密码,也能被hash出同样的值。这只需要一个很简单的程序:

(0);

$i = 0;

while (true) {

if (crc32(($i)) == ) {

echo ($i);

exit;

$i++;

这个程序可能需要运行一段时间,但是最终它能返回一个字符串。我们可以使用这个字符串来代替‘’,并使用它成功的登录使用该密码的用户帐户。

比如在我的电脑上运行上面的程序几个月后,我得到了一个字符串:‘==’。我们来测试一下:

echo crc32(”);

// :

echo crc32(‘==’);

// :

如何解决?

现在一个稍强一点的家用PC机就可以一秒钟运行十亿次hash函数,所以我们需要一个能产生更大范围的结果的hash函数。比如md5()就更合适一些,它可以产生128位的hash值,也就是有340,282,366,920,938,463,463,374,607,431,768,211,456种可能的 输出。所以人们一般不可能做那么多次循环来找到hash碰撞。然而仍然有人找到方法来做这件事情,详细可以查看例子。

sha1()是一个更好的替代方案,因为它产生长达160位的hash值。

5.问题2:彩虹表

即使我们解决了碰撞问题,还是不够安全。

“彩虹表通过计算常用的词及它们的组合的hash值建立起来的表。”

这个表可能存储了几百万甚至十亿条数据。现在存储已经非常的便宜,所以可以建立非常大的彩虹表。

现在我们假设一个人窃取了数据库,得到了几百万个hash过的密码。窃取者可以很容易地一个一个地在彩虹表中查找这些hash值,并得到原始密码。虽然不是所有的hash值都能在彩虹表中找到,但是肯定会有能找到的。

如何解决?

我们可以尝试给密码加点干扰,比如下面的例子:

$ = “”;

// this may be found in a table

// the 2 words

echo sha1($); //

// use bunch of , and it can be than this

$salt = “f#@V)Hu^%Hgfds”;

// this will NOT be found in any pre-built table

echo sha1($salt . $); //

在这里我们所做的只是在每个密码前附加上一个干扰字符串后进行hash,只要附加的字符串足够复杂,hash后的值肯定是在预建的彩虹表中找不到的。不过现在还是不够安全。

6.问题3:还是彩虹表

注意,彩虹表可能在窃取到干拢字符串后重头开始建立。干扰字符串一样也可能被和数据库一起被窃取,然后他们可以利用这个干扰字符串从头开始创建彩虹表,如“”的hash值可能在普通的彩虹表中存在,但是在新建的彩虹表里,“f#@V)Hu^%”的hash值也会存在。

如何解决?

php try throw catch

我们可以对每个用户使用唯一的干扰字符串。一个可用的方案就是使用用户在数据库中的id:

$hash = sha1($ . $);

这种方法的前提是用户的id是一个不变的值(一般应用都是这样的)

我们也可以为每个用户随机生成一串唯一的干扰字符串,不过我们也需要将这个串存储起来:

// a 22 long

() {

(sha1(()),0,22);

$ = ();

$hash = sha1($ . $);

// and save the $ with the user

// …

这种方法就防止了我们受到彩虹表的危害,因为每一个密码都使用一个不同的字符串进行了干扰。攻击者需要创建和密码数量一样的彩虹表,这是很不切实际的。

7.问题4:hash速度

大部分hash算法在设计时就考虑了速度问题,因为它一般用来计算大数据或文件的hash值php try throw catch,以验证数据的正确性和完整性。

如何产生?

如前所述理解php Hash函数,增强密码安全,现在一台强劲的PC机可以一秒运算数十亿次,很容易用暴力破解法去尝试每个密码。你可能会以为8个以上字符的密码就可以避免被暴力破解了,但是让我们来看看是否真是这样:

如果密码可以包含小写字母,大写字母和数字,那就有62(26+26+10)个字符可选;

一个8位的密码有62^8种可能组合,这个数字略大于218万亿。

以一秒钟运算10亿次hash值的速度计算,这只需要60小时就可以解决。

对于一个6位的密码,也是很常用的密码,只需要1分钟就可以破解。要求9到10位的密码可能会比较安全了,不过这样有的用户可能会觉得很麻烦。

如何解决?

使用慢一点的hash函数。

“假设你使用一个在相同硬件条件下一秒钟只能运行100万次的算法来代替一秒10亿次的算法,那么攻击者可能需要要花1000倍的时间来做暴力破解,60小只将会变成7年!”

你可以自己实现这种方法:

($, $) {

$salt = “f#@V)Hu^%Hgfds”;

$hash = sha1($ . $);

// make it take 1000 times

for ($i = 0; $i < 1000; $i++) {

$hash = sha1($hash);

$hash;

你也可以使用一个支持“成本参数”的算法,比如 。在php中可以用crypt()函数实现:

($, $) {

// the salt for be 22 long

crypt($, ‘$2a$10.$’);

这个函数的第二个参数包含了由”$”符号分隔的几个值。第一个值是“$2a”,指明应该使用算法。第二个参数“$10”在这里就是成本参数,这是以2为底的对数,指示计算循环迭代的次数(10 => 2^10 = 1024),取值可以从04到31。

举个例子:

($, $) {

crypt($, ‘$2a$10.$’);

() {

(sha1(()),0,22);

$ = “”;

echo ($, ());

// : $2a$10$

结果的hash值包含$2a算法,成本参数$10,以及一个我们使用的22位干扰字符串。剩下的就是计算出来的hash值理解php Hash函数,增强密码安全,我们来运行一个测试程序:

// this was from the

$hash = ‘$2a$10$’;

// this is the the user to log back in

$ = “”;

if (($hash, $)) {

echo ” !”;

} else {

echo ” !”;

($hash, $) {

// first 29 , cost and salt

// let’s call it $

$ = ($hash, 0, 29);

// run the hash on $

$ = crypt($, $);

// true or false

($hash == $);

运行它,我们会看到” !”

8.整合起来

根据以上的几点讨论php try throw catch,我们写了一个工具类:

class {

//

$algo = ‘$2a’;

// cost

$cost = ‘$10’;

// for use

() {

(sha1(()),0,22);

// this will be used to a hash

hash($) {

crypt($,

self::$algo .

self::$cost .

‘$’. self::());

// this will be used to a a hash

($hash, $) {

$ = ($hash, 0, 29);

$ = crypt($, $);

($hash == $);

以下是注册时的用法:

// the class

(“.php”);

// read all form input from $_POST

// …

// do your form stuff

// …

// hash the

$ = ::hash($_POST

”

);

// store all user info in the DB, $_POST

”

// store $

// …

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » 理解php Hash函数,增强密码安全

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们