Yii2 账号登录需要注意的地方 - 生成密码函数generatePasswordHash很慢 [ 2.0 版本 ]
原文链接: Yii2 账号登录需要注意的地方 – 生成密码函数generatePasswordHash很慢
Yii2默认的用户组件,在登录用户,都需要先把密码加密,然后去数据查询核对,
密码加密的代码如下:
\Yii::$app->security->generatePasswordHash($password);
Yii2/base/Security.php
public function generatePasswordHash($password, $cost = null)
{
if ($cost === null) {
$cost = $this->passwordHashCost;
}
if (function_exists('password_hash')) {
/** @noinspection PhpUndefinedConstantInspection */
return password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);
}
$salt = $this->generateSalt($cost);
$hash = crypt($password, $salt);
// strlen() is safe since crypt() returns only ascii
if (!is_string($hash) || strlen($hash) !== 60) {
throw new Exception('Unknown error occurred while generating hash.');
}
return $hash;
}
最后,发现代码耗时卡在 $hash = crypt($password, $salt);
也即是php的crypt函数。在我的linux上面耗费了520ms
现在的系统验证码,有很多包,是可以破的,玩爬虫的,都有付费的机器学习类的破验证码,普通的文字数字验证码,很轻松能破,验证码一破,账号注册登录被爬虫搞起来,很快就把php进程堵死了。
如果你的系统,登录注册很频繁,建议重写一下这个函数,不过是否在某些方面存在安全性,这个我说不好,自己取舍一下。
上面是我测试的结果,大家有兴趣可以都测试试试。
Fecshop 深圳
注册时间:2016-01-21
最后登录:2024-08-13
在线时长:73小时36分
最后登录:2024-08-13
在线时长:73小时36分
- 粉丝157
- 金钱2381
- 威望490
- 积分8011
共 3 条评论
我上面是php5.4测试的,没有password_hash函数
对于php5.5以上和php7 , 存在password_hash函数,会执行
return password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);
这个我没有测试,有对应php环境的同学回馈,同样很慢。
上面是我的测试,有不同声音的童鞋多发表自己测试的结果,对于一些投票或者其他的,短时间内登录用户比较多的系统,建议重写
\Yii::$app->security->generatePasswordHash($password);
哥们你用什么方法测试的啊 和工具
最后,推荐一下我的开源商城:Fecshop。
Github地址:https://github.com/fancyecommerce/yii2_fecshop
Fecshop 全称为Fancy ECommerce Shop,是基于php Yii2框架之上开发的一款优秀的开源电商系统,遵循OSL3.0协议, Fecshop支持多语言,多货币,架构上支持pc,手机web,手机app,和erp对接等入口,您可以免费快速的定制和部署属于您的电商系统。
FecShop English Demo:http://fecshop.appfront.fancyecommerce.com/
FecShop 中文演示地址:http://fecshop.appfront.fancyecommerce.com/cn
FecShop QQ群:186604851 ,入群验证:fecshop
这么丑你也有脸写出来
@stolen 建议你去医院挂个眼科,有病,得治!
是有一个const参数说,YII解说是时间成本参数,成本越大越安全,我把const改为15测试生成密码要3秒,不能忍受
Yii::$app->security->generatePasswordHash('123456', 15);耗时3.214418888092,可以根据自己的需求来调整这个const参数,改为10的话耗时约0.093096971511841
多谢分享,没有注意第二个参数,是个不错的选择,改一下后面的值。
@xiaoshenzhen 不客气,要研究里面的源码才知道的,哈哈,我这几天在深圳哦
@shuliangfu 来深圳好好玩玩吧。
这个方法比重写好