温馨提示:本文翻译自stackoverflow.com,查看原文请点击:security - Timing safe comparison of strings
hmac security string tcl

security - 定时安全比较字符串

发布于 2020-04-24 17:25:53

Tcl是否具有任何内置功能可按时间安全方式比较字符串,因此不会因短路而泄漏任何机密信息?

string equal 从左边开始并返回第一个差异,因此不适合比较秘密。

具体来说,我想比较两个sha256HMAC。Double HMAC也可以解决泄漏问题,但是我想找到一个时序安全的比较功能。

查看更多

提问者
kelunik
被浏览
39
Donal Fellows 2016-01-31 16:58

假设您正在处理两个相同长度的字符串(例如,HMAC),则可以对每个字符进行比较并累加结果:

proc safeequal {s1 s2} {
    set equal 1
    foreach c1 [split $s1 ""] c2 [split $s2 ""] {
        set equal [expr {$equal & ($c1 eq $c2)}]
    }
    return $equal
}

现在,由于split进行字符共享,可能会产生一些时序影响,但是要确定字符串的内容非常困难,因为时序无法通过位置进行识别,并且无论如何都会降低时序的准确性。噪声。即使比较每个字符都相等的两个字符串(大约HMAC长度)和比较每个字符不同的两个字符串,我也无法使我的系统足够安静以至于看不到任何区别。

% time {safeequal qwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnm} 100000
9.847818689999999 microseconds per iteration
% time {safeequal qwertyuiopasdfghjklzxcvbnm QWERTYUIOPASDFGHJKLZXCVBNM} 100000
9.78685247 microseconds per iteration
% time {safeequal qwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnm} 100000
9.72245421 microseconds per iteration
% time {safeequal qwertyuiopasdfghjklzxcvbnm QWERTYUIOPASDFGHJKLZXCVBNM} 100000
9.88214891 microseconds per iteration