Side-Channel-Attack

恆定時間空字元串驗證

  • July 5, 2022

檢查 null 需要==檢查。如果您有一個字元串秘密(例如一個十六進制編碼的密鑰)並且您想檢查它是否為空以進行驗證,您是否應該將其與""恆定時間進行比較?

在這些情況下,您不會聽說恆定時間等於。

我認為這是指像 Java 或 C# 這樣的語言,其中檢查空參數是司空見慣的。我也猜想閱讀這樣的部落格文章/文章會激發這種擔憂

  1. 建議使用空值檢查以獲得良好的驗證(例如,拋出方便的異常消息)。當您不檢查 null 時,IDE 可能會顯示警告。
  2. 所述語言的密碼庫包括空值檢查。
  3. 恆定時間比較函式通常檢查被比較的數組的長度。這相當於做if (string.Length == 0) { return error; }.

總之,檢查 null 和字元串是否為空應該是完全可以的。

  • 在檢查數組是否全為零時,libsodium提供了一個恆定時間函式。
  • 在將秘密與任何其他秘密(例如兩個密碼)或兩個身份驗證標籤進行比較時,您應該始終使用恆定時間函式。當長度可能不同時,您可以生成一個隨機密鑰並比較兩個密鑰的 HMAC。
  • 使用恆定時間十六進制函式也很明智,這些函式再次在libsodium中可用。

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