【问题标题】:Dart constant time string comparisonDart 常量时间字符串比较
【发布时间】:2014-11-19 00:16:35
【问题描述】:

我正在 dart 中实现一个 github 推送钩子监听器,我遇到了这个文档:https://developer.github.com/webhooks/securing/

写在哪里:

不建议使用普通的 == 运算符。像secure_compare这样的方法 执行“恒定时间”字符串比较,使其安全 来自针对常规相等运算符的某些定时攻击。

我必须比较 2 个哈希值是否相等。现在我想知道是否有办法在飞镖中以恒定时间比较字符串? (阅读:dart中有字符串常量时间比较函数吗?)

【问题讨论】:

  • 那里的“恒定时间”一词似乎相当混乱。这通常用于表示 O(1)。
  • 是的,就是这个意思。

标签: github hash dart


【解决方案1】:

default implementation 不是常数时间,但您可以创建自己的比较函数来比较字符串中的每个代码单元并且不会短路:

bool secureCompare(String a, String b) {
  if(a.codeUnits.length != b.codeUnits.length)
    return false;

  var r = 0;
  for(int i = 0; i < a.codeUnits.length; i++) {
    r |= a.codeUnitAt(i) ^ b.codeUnitAt(i);
  }
  return r == 0;
}

只要两个输入字符串的长度相同,此函数就会执行恒定时间字符串比较。由于您正在比较哈希,这应该不是问题,但对于可变长度字符串,此方法仍会泄漏时间信息,因为如果长度不相等,它会立即返回。

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多