Libsodium
驗證 libsodium 中的 HMAC
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
?
memcmp()
不是常數時間。稱為“恆定時間”的屬性並不意味著(令人困惑地)每個都在恆定的時間內執行。如果算法實現不通過基於時間的邊通道洩漏有關秘密數據的資訊,則稱該算法實現是“恆定時間的”。在 的情況下
memcmp()
,洩漏很簡單:memcmp()
以地址遞增順序查看字節,並在字節不同的第一個索引處停止。因此,如果攻擊者觀察到執行時間和記憶體訪問模式,可能會揭示有多少字節是相同的。如果攻擊者可以使用各種聲稱的“HMAC”值重複實驗,他可以使用該洩漏來學習完整的真實 HMAC 值,這在某些情況下可能是一件非常糟糕的事情。有關該主題的更多資訊,請參閱BearSSL 文件中的此頁面。