Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 恒定时间字符串比较函数_String_Security_Winapi_Constant Time - Fatal编程技术网

String 恒定时间字符串比较函数

String 恒定时间字符串比较函数,string,security,winapi,constant-time,String,Security,Winapi,Constant Time,为了比较两个字符串,我目前使用strcmp或它的一个变体。但是,由于如果匹配更多字符,strcmp需要更长的时间,因此容易受到定时攻击。Windows上的标准库中是否有常量时间字符串比较函数?我认为Windows和Visual Studio都没有此类函数 至少像strcmp这样简单的东西,你可以自己动手做 如果你只关心平等: int strctcmp(const char*a, const char*b) { int r = 0; for (; *a && *b; ++a

为了比较两个字符串,我目前使用strcmp或它的一个变体。但是,由于如果匹配更多字符,strcmp需要更长的时间,因此容易受到定时攻击。Windows上的标准库中是否有常量时间字符串比较函数?

我认为Windows和Visual Studio都没有此类函数

至少像strcmp这样简单的东西,你可以自己动手做

如果你只关心平等:

int strctcmp(const char*a, const char*b)
{
  int r = 0;
  for (; *a && *b; ++a, ++b)
  {
    r |= *a != *b;
  }
  return r;
}
如果需要排序结果,则需要处理所有最长字符串:

int strctcmp(const char*a, const char*b)
{
  int r = 0, c;
  for (;;)
  {
    c = *a - *b;
    if (!r) r = c;
    if (!*a && !*b) break;
    if (*a) ++a;
    if (*b) ++b;
  }
  return r;
}

这些不是完美的计时方式,但对于任何基于网络的东西都应该足够好。

限制最大字符串长度并用零填充,同时在固定循环中累积差异,也许?或者,我想您可以尝试计算字符串的加密哈希摘要,并进行比较,这样就不会泄露有关预先计算的数据库密钥内容的边带信息。不过,我不知道如何有效地取消Windows上罕见字符串的缓存/分页效果。