Libsodium

驗證 libsodium 中的 HMAC

  • August 2, 2018

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 文件中的此頁面

引用自:https://crypto.stackexchange.com/questions/61261