即使使用經過身份驗證的加密,如何提供完整性?
吉爾斯在這裡發表了以下評論:
使用經過身份驗證的加密並不能保證完整性,只能保證真實性。您無法檢測到回滾。
從我收集到的:
我們通常有以下 3 個屬性:
機密性:只有授權使用者才能讀取數據(並理解它)。
完整性:使用者保證數據沒有被修改,或者換句話說,只有授權使用者才能修改數據。
真實性:使用者保證數據/實體是他們的身份(這與身份不同)。
Gilles 的場景如下:
- 我們心愛的 Alice 使用 Authenticated Encryption 將一些數據儲存在伺服器上。
- 在某個時候,Eve 侵入了她的伺服器並獲取了加密數據的副本。
- Alice 再次在伺服器上儲存一些數據,仍然使用她的安全認證加密。
- Eve 將數據替換為她之前獲取的數據(因此標籤仍然有效)。
因此我們有一個回滾。Bob 訪問數據可以看到它們是真實的,即它們確實來自 Alice。
我們是否可以考慮保留數據的完整性? 同時它們已經被修改(替換)但之前的數據沒有被修改(為了保持認證標籤有效)。在這種情況下,完整性屬性不應該被保留嗎?
是否有任何提供此類屬性的方案,還是應該使用其他方式提供的東西(例如,與數據不在同一位置的版本系統)?換句話說,是否有任何允許檢測回滾的加密方案(據我所知,沒有)?
我確實看到,如果數據已被修改,則不再提供身份驗證,因為標籤將不匹配。或者從邏輯的角度來看:
$$ \neg Integrity \implies \neg Authenticity $$
因此使用我們得到的邏輯對立:
$$ Authenticity \implies Integrity $$
這似乎與 Gilles 的評論相矛盾。
完整性有幾個概念。真實性可以被認為是數據與其創建者/修改者/發送者之間關聯的完整性。還有數據內部結構的完整性和數據庫管理內部的多個完整性定義。
還要注意,密碼學不能幫助防止完整性違規,它只能幫助檢測它們。因此,當我提到完整性是通過密碼強制執行時,這意味著有密碼方法可以檢測未經授權的修改,而不是實際阻止任何修改。從最嚴格的意義上講,密碼學也不能保持完整性。
並非所有完整性概念都可以直接以加密方式執行。因此,這個問題的答案取決於數據完整性的確切定義:如果我們認為 Alice 可以看到單個數據項或內容結構,那麼它的完整性就會得到保留。
但是,考慮到數據庫版本歷史的完整性,完整性不會被保留。
如果 Eve 對數據庫有這樣的訪問權限,以至於她能夠偽裝成 Alice 訪問數據庫,那麼就無能為力了。下面我假設 Eve 對數據庫的訪問不包括對數據庫私鑰的訪問或數據庫與 Alice 之間的身份驗證過程。
為了防止此類未經授權的回滾,基本上需要版本控制。數據庫應具有指示最新更新編號的內部結構(元數據),並且 Alice 應將此編號包含在她的已驗證數據中。為了以加密方式強制執行關聯,數據庫需要對 db-internal 版本號以及 Alice 在每次更新期間發送的版本號進行簽名。然後 Bob 可以將簽名的 db-internal 版本與 Alice 在她的已驗證數據中的版本進行比較。
當然,另一種方法是區塊鏈。它們是僅追加數據庫,無法進行回滾。有了區塊鏈,Eve 對數據庫的訪問範圍可能會更廣,但回滾仍然是不可行的。然而,將區塊鏈功能集成到傳統數據庫中本身就是一個單獨的主題——但如果回滾是為某些大規模但定義明確的功能設計的數據庫中的一個主要問題,那麼區塊鏈可能是值得的。