时序攻击

  • Jesse
  • 2019-07-12 19:06:20
  • 267

在校验验证码或密码时,可以使用 hash_equals 方法

hash_equals 是可防止时序攻击的字符串比较,那么什么是时序攻击呢?比如我们使用这段代码进行比较

$code == $_POST['code'];

那么两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。而使用 hash_equals 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。

如果 PHP 不支持此方法或想自己实现的,可以参考如下:

<?php
if(!function_exists('hash_equals')) {
  function hash_equals($str1, $str2) {
    if(strlen($str1) != strlen($str2)) {
      return false;
    } else {
      $res = $str1 ^ $str2;
      $ret = 0;
      for($i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]);
      return !$ret;
    }
  }
}
?>

本文出自 ShowCj,转载时请注明出处及相应链接。