md5 - PHP:crypt()函数。请问其加密后的密值有可能等于盐值么?
本文介绍了md5 - PHP:crypt()函数。请问其加密后的密值有可能等于盐值么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
最近看到一个web应用中,别人关于用户验证这一块,用到了PHP:crypt(string str, string [salt]) 这个函数。具体的代码如下:
if ($auth != crypt(md5($cdata), $auth))
{
exit(); //exit,验证失败;
}
//验证成功,运行之后代码;
我想请问一下,这个函数中的加密后的密值怎么会等于盐值的,要怎样这个验证条件才能成立啊???根本想不通啊,求教!
解决方案
先说结论,可以的。
Yii中的发现
今天在研究Yii2.0框架关于密码登陆的问题,同样发现这个问题。经过亲身实践,发现原理。
举个简单例子:
<?php
$password = '1234567';
$hash = '$2y$13$4Y5KRDHPFYF.rYumLe6rx.4IcM6PIB6KQWQHpWwVnN5PMnJnd/4ia';
$test = crypt($password,$hash);
echo $test==$hash; //判断密码crypt后是否和盐值一样
?>
>>> 1 //输出
原因
原因在于这个hash不是一个标准的hash。
标准的Blowfish Hash应该是以
$2a$
、$2x$
或者$2y$
开头,然后是用于cost参数
的两位数字,紧接着一个$字符
,最后是22位./0-9A-Za-z
范围里的字符.
所以这个hash应该是到了$2y$13$4Y5KRDHPFYF.rYumLe6rx.
就结束了,那么后面的4IcM6PIB6KQWQHpWwVnN5PMnJnd/4ia
好像就被crypt忽略了。
而实际上,后面的4IcM6PIB6KQWQHpWwVnN5PMnJnd/4ia
就是加密后的密值一部分。
所以通过这个原理,数据库里直接把这个特异hash保存后,直接比对是否和crypt后的密值相同,同则通过登录,不同则拒绝。
这篇关于md5 - PHP:crypt()函数。请问其加密后的密值有可能等于盐值么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文