Dart常量时间字符串比较

时间:2014-11-19 00:16:36

标签: github hash dart

我在dart中实现了一个github push hook监听器,我遇到过这个文档:https://developer.github.com/webhooks/securing/

写的地方:

  

不建议使用普通的==运算符。像secure_compare这样的方法   执行“常量时间”字符串比较,使其安全   从某些时间攻击正常的平等操作员。

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

1 个答案:

答案 0 :(得分:4)

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;
}

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

相关问题