我在dart中实现了一个github push hook监听器,我遇到过这个文档:https://developer.github.com/webhooks/securing/
写的地方:
不建议使用普通的==运算符。像secure_compare这样的方法 执行“常量时间”字符串比较,使其安全 从某些时间攻击正常的平等操作员。
我必须比较2个哈希的相等性。现在我想知道是否有办法比较飞镖中恒定时间的弦? (读:飞镖中有一个字符串常量时间比较函数吗?)
答案 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;
}
只要两个输入字符串具有相同的长度,此函数将执行常量字符串比较。由于你比较哈希这不应该是一个问题,但对于可变长度的字符串,这个方法仍然会泄漏时间信息,因为如果长度不相等它会立即返回。