Laravel 5哈希函数在共享主机上运行很慢


Laravel 5 Hash function runs very slowly on shared host

我目前正在使用Laravel为Android设备开发一个简单的API。我正在尝试验证每个请求,以便我知道请求是由合法用户发出的。为此,我要求每个合法请求都包含参数user id和key。android应用程序将在用户成功登录后获取所需信息并存储在设备中。来自设备的每个请求都将包含用户id和密钥作为参数。

我使用中间件检查每个请求,代码如下:

class AuthenticatedUser {
    /**
     * Handle an incoming request.
     *
     * @param  'Illuminate'Http'Request  $request
     * @param  'Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $input = $request->only('userID','key');
        $u = User::where(['id' => $input['userID']])->first();
        if($u && Hash::check($input['key'],$u->app_key)){
            Session::flash('user',$u);
            return $next($request);
        }
        else{
            return response(['status' => 'ERROR' , 'message' => 'AUTH_FAILURE', 'payload' => [] ],401);
        }
    }
}
基本上,中间件检查具有给定用户id和密钥的用户是否存在,如果用户存在,则将该用户存储在临时会话中。如果不存在这样的用户,它将返回一个错误。

我的问题是每个请求将花费800-1000毫秒。经过一些修改,我发现Hash::Check是造成延迟的原因。我试图删除Hash::Check代码,每个请求大约需要300-400ms

然后我尝试在两个不同的免费VM工作空间服务上部署这个应用程序,请求将花费大约350-400ms, Hash::Check完好无损。是什么原因导致的呢?为什么Hash::Check功能在共享主机上运行时间很长,而在虚拟机上运行时间短?

共享主机使用的PHP版本为5.4.41,虚拟机使用的PHP版本为5.5.9

这很可能只是资源不同的问题。即使虚拟机占用了PC资源的1/8,这也可能是共享主机的两倍。

你可以降低工作因子来加速哈希过程(这也会减少蛮力抵抗)。你可以考虑的一个选项是JSON web令牌。

最新的IT安全指南建议使用较慢的散列函数,因为用户一次登录到网站,这个登录可能有点慢,但较慢的登录过程阻碍了暴力攻击。

如果你在每个rest请求中都检查凭据,你应该考虑使用其他哈希函数