我正在 dart 中实现一个 github Push hook 监听器,并且我遇到了这个文档: https: //developer.github.com/webhooks/securing/
\n\n写在哪里:
\n\n\n\n\n不建议使用普通的 == 运算符。像 secure_compare 这样的方法执行 \xe2\x80\x9c 恒定时间\xe2\x80\x9d 字符串比较,这使其免受针对常规相等运算符的某些定时攻击。
\n
我必须比较两个哈希是否相等。现在我想知道是否有一种方法可以在 dart 中以恒定时间比较字符串?(阅读:dart中有字符串常量时间比较函数吗?)
\n默认实现不是恒定时间,但您可以创建自己的比较函数来比较字符串中的每个代码单元并且不会短路:
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;
}
Run Code Online (Sandbox Code Playgroud)
只要两个输入字符串的长度相同,该函数就会执行恒定时间的字符串比较。由于您正在比较哈希值,这应该不是问题,但对于可变长度字符串,此方法仍然会泄漏计时信息,因为如果长度不相等,它会立即返回。