PHP:crypt()函数。请问其加密后的密值有可能等于盐值么?
最近看到一个web应用中,别人关于用户验证这一块,用到了PHP:crypt(string str, string [salt]) 这个函数。具体的代码如下:
if ($auth != crypt(md5($cdata), $auth))
{
exit(); //exit,验证失败;
}
//验证成功,运行之后代码;
我想请问一下,这个函数中的加密后的密值怎么会等于盐值的,要怎样这个验证条件才能成立啊???根本想不通啊,求教!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Yii中的发现
今天在研究Yii2.0框架关于密码登陆的问题,同样发现这个问题。经过亲身实践,发现原理。
举个简单例子:
原因
原因在于这个hash不是一个标准的hash。
所以这个hash应该是到了
$2y$13$4Y5KRDHPFYF.rYumLe6rx.
就结束了,那么后面的4IcM6PIB6KQWQHpWwVnN5PMnJnd/4ia
好像就被crypt忽略了。而实际上,后面的
4IcM6PIB6KQWQHpWwVnN5PMnJnd/4ia
就是加密后的密值一部分。所以通过这个原理,数据库里直接把这个特异hash保存后,直接比对是否和crypt后的密值相同,同则通过登录,不同则拒绝。
一系列测试:
其实你也能看出来了,默认CRYPT_STD_DES算法下,盐值只有前两位有效,而且盐值会保存在结果的前两位。
文档也说了:
其他算法产生的hash也有类似的机制,在结果起始部分保存盐值,计算hash时只取符合格式的部分作为盐值,这些在官方文档都有描述。
私货:
bcryptjs 同一个字符串 每次生成的 hash 值都不一样
这代码写的有问题吧。这咋可能相等啊,