libsodium通过以下代码验证HMAC是正确的:
return crypto_verify_32(h, correct) | (-(h == correct)) | sodium_memcmp(correct, h, 32);crypto_verify_32在哪里
for (i = 0; i < n; i++) {
d |= x[i] ^ y[i];
}
return (1 & ((d - 1) >> 8)) - 1;而sodium_memcmp是
for (i = 0U; i < len; i++) {
d |= b1[i] ^ b2[i];
}
return (1 & ((d - 1) >> 8)) - 1;为什么不使用简单的memcmp呢?
发布于 2018-08-02 14:53:02
memcmp()不是常数时间.名为“恒定时间”的属性并不意味着(令人困惑地)每一次运行都是在固定的时间内;如果算法实现不通过基于定时的侧通道泄漏关于秘密数据的信息,则称为“恒定时间”。
在memcmp()的情况下,泄漏很简单:memcmp()以递增的地址顺序查看字节,并在字节不同的第一个索引处停止。因此,如果攻击者观察到执行时间和内存访问模式,可能会显示有多少字节是相同的。如果攻击者能够重复各种所谓的" HMAC“值的实验,他可以利用该漏洞来学习完整的真实HMAC值,在某些情况下这可能是非常糟糕的事情。
有关此主题的更多信息,请参见BearSSL文档中的此页面。
https://crypto.stackexchange.com/questions/61261
复制相似问题