Integrity

哪種防篡改算法提供最短的輸出?

  • March 19, 2018

背景

在製作 Web 應用程序時,您有時需要將數據與使用者不可見的表單一起傳遞。數據庫 ID 是最常見的,但有時也需要文本和 ID。由於這個原因<hidden>,HTML 中有一個欄位,但它有一個缺點 - 任何對自己所做的事情有基本了解的黑客都可以修改該值。如果這些值能夠被篡改保護(如果不是完全加密的話)會更好。

問題

我需要通過敵對領土傳遞價值。該值通常是一個整數(並且通常小於 65'000,因此通常只有兩個非零字節,很少是三個,幾乎從不是 4)。但是有時該值也可以是字元串(很短,最多幾百個字元)。我可以對不同類型的數據使用不同的算法。

我想篡改保護該值,以便在不檢測的情況下無法在途中更改它。隱藏數據不是必需的,但這樣做會是一個好處。因此,防篡改或加密都可以。

無論採用何種算法,我都希望輸出盡可能短,同時又不犧牲太多安全性。這是因為它是一個網頁,較短的數據意味著更快的響應時間。此外,如果其中沒有冗長的隨機字元串,HTML 程式碼將變得更易於閱讀。

為此,您會建議什麼算法?

您正在寫出數據並在同一台伺服器上讀取它。您要確保讀回的數據與寫出的數據相同。

對於這個案例,對稱密碼學似乎是合適的。擁有一個不會離開伺服器的對稱密鑰。僅當伺服器受到威脅時,您才需要輪換密鑰;這將使正在進行的會話無效,在伺服器受損的情況下也可能由於其他原因而發生這種情況。

您可以添加數據的HMAC校驗和;使用 HMAC-SHA-256(強烈推薦的選擇),如果您以十六進制編碼校驗和,則增加 64 個字節;如果以 base64 編碼,則增加 44 個字節(如果以二進制形式包含,則增加 32 個字節,但這往往很難解析)。將字元串放在某處可能會增加幾個字節的成本。鑑於上下文——一個網頁——我認為削弱加密強度以節省更多字節沒有任何意義。

如果您還想加密數據,請使用 AES-128 和經過身份驗證的加密模式(CCMGCM是常見的選擇)。由於加密數據可以使用所有字節值(base64 的 4/3 因子),由於編碼要求將產生 16 字節的 IV、最多 16 字節的填充、16 字節的 MAC 和乘法因子的成本。在對數據進行任何處理之前,您需要解密數據;特別是,如果在客戶端使用了其中的一些數據,您將需要複製它或將經過身份驗證的加密與該 MAC 以及客戶端可讀數據相結合。

請注意,以這種方式保護數據只會對其進行身份驗證——它證明數據是由您的伺服器生成的。攻擊者仍然可以從一個頁面中獲取數據並將其與另一個頁面或該頁面的更高版本一起發送。如何避免這種情況取決於數據何時合法。例如,您可能希望在散列數據中包含 URL 或使用者 ID,以避免脫離上下文使用數據。

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