看 Laravel5.8 发送验证码比对时,发现该 hash_equals() ,好奇,故查找,真是涨见识了
-
首先翻文档
比较两个字符串,无论它们是否相等,本函数的时间消耗是恒定的。
当验证码进行比较,那么两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景
-
时序攻击(摘录链接)
其次看验证的代码
if (!hash_equals($verifyData['code'], $request->verification_code)) {
// 返回401
return $this->response->errorUnauthorized('验证码错误');
}
很简单的一个功能,也很容易理解,为了防止时序攻击。
因为==是逐位比较的,所以可以判断出目标字符串的长度。
从业这么多年,从来没想过还要有这么多防范措施。