【问题标题】:Constant-time string comparison function恒定时间字符串比较函数
【发布时间】:2017-07-25 14:13:51
【问题描述】:

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

【问题讨论】:

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

标签: string security winapi constant-time


【解决方案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;
}

这些在时间方面并不完美,但对于任何基于网络的东西来说应该绰绰有余。

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多