我目前正在使用Laravel for 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-400毫秒
然后我尝试在两个不同的免费VM Workspace服务上部署此应用程序,并且请求将花费大约350-400ms,Hash :: Check保持不变。有什么可能导致这种情况?为什么Hash :: Check函数在共享主机上需要很长时间,而在VM上却不需要?
共享主机上使用的PHP版本是5.4.41,而VM的PHP版本是5.5.9
答案 0 :(得分:0)
最新的IT安全指南建议使用较慢的散列函数,因为用户登录网站一次,此登录可能有点慢但登录过程较慢会阻碍暴力攻击。
如果要检查每个休息请求中的凭据,则应考虑使用其他散列函数。
答案 1 :(得分:0)
这很可能仅仅是不同资源的问题。即使VM使用PC资源的1/8,也可能是共享主机上的两倍。
您可以降低工作系数以加快散列过程(这也会降低强力抵抗力)。您可以考虑的一个选项是JSON web tokens。