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进程堵死了。

如果你的系统,登录注册很频繁,建议重写一下这个函数,不过是否在某些方面存在安全性,这个我说不好,自己取舍一下。

上面是我测试的结果,大家有兴趣可以都测试试试。

《Yii2 账号登录需要注意的地方 – 生成密码函数generatePasswordHash很慢》有3个想法

  1. shuliangfu(Yiichina社区的评论回答)
    是有一个const参数说,YII解说是时间成本参数,成本越大越安全,我把const改为15测试生成密码要3秒,不能忍受
    Yii::$app->security->generatePasswordHash(‘123456’, 15);耗时3.214418888092,可以根据自己的需求来调整这个const参数,改为10的话耗时约0.093096971511841

    1. 不是运算速度变慢,是生成更加复杂,暴力破解需要的时间更长,这样,造成生成hash密码的时间也很长。

      所以注册服务器还是尽量用单独的,有攻击,很容易吧php进程都塞死。

王旭飞进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注