恒定时间字符串比较功能

时间:2017-07-25 14:13:51

标签: string security winapi constant-time

为了比较两个字符串,我目前使用strcmp或其中一个变体。但是,因为如果更多字符匹配,strcmp会花费更长时间,因此很容易受到时序攻击。 Windows上的标准库中是否有常量字符串比较功能?

1 个答案:

答案 0 :(得分:-1)

我不认为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;
}

这些并不是完美的时间选择,但对于任何基于网络的东西都应该足够好。