在數據庫中加密數據的安全方法
我正在設計一個程序,該程序對本地儲存的數據庫進行查詢,該數據庫可能包含大量敏感資訊。因此,必須盡可能保護資訊免受任何可能的攻擊。我計劃通過 AES-256 在 CBC 模式下加密數據來做到這一點。加密/解密密鑰將保持安全。
我的問題是,使用這種方案,應該如何加密數據庫以確保數據免受攻擊?最初我計劃逐個單元加密數據庫(每行有 10 列左右)並為每行儲存一個唯一的、隨機生成的 IV。
但是,據我對生成的流的理解,這可能會導致問題,因為我將使用相同的密鑰 + IV 組合來加密/解密該行的所有單元格。這將允許攻擊者潛在地計算兩個單元格的 XOR 並揭示足夠的資訊,以便他們可以解密整個行(兩次填充)。我知道這在 CTR 模式下更多是一個問題,但我已經讀到如果兩個單元格以相同的字節序列開頭,這在 CBC 中也可能是一個問題。如果我誤解了這種攻擊的概念,請糾正我,因為我仍然不確定它的確切機制。
加密整個數據庫本身並不是很漂亮,如果數據庫足夠大,顯然會導致性能問題。因此,我能想到的唯一其他方法是讓每個 CELL 都有一個獨特的隨機 IV,從表面上看,這似乎需要儲存很多額外的數據,但如果需要,我會走這條路。
就像旁註一樣;該程序並未在任何安全性成為問題的地方實施。學習密碼學的複雜性和防禦攻擊的方法對我來說更像是一個副業。感謝您提前提供的所有幫助!
無論您使用哪種加密算法,對不同的、獨立加密的單元使用相同的密鑰和 IV 都是一個壞主意。它將允許攻擊者找到單元格的 XOR(使用 CTR)或至少相等的前綴(使用 CBC)。
如果要使用經過身份驗證的加密,則需要選擇 MAC 是獨立應用於每個單元(無論如何都會添加數據)還是將行作為一個整體。
- 如果您選擇整個行,您可能也希望將整行加密為一個,因為無論如何您都需要閱讀所有行。但是,如果 MAC 驗證比解密快得多,您可能仍希望使用行範圍的 MAC 對每個單元進行加密。
- 如果您選擇每單元 MAC,則您已經添加了大量數據,因此您也可以使用每單元 IV。或者您可能會更加堅決地避免添加任何額外數據,具體取決於您的要求。
如果您最終想要進行每單元加密,但不能擁有每單元 IV,那麼 CTR 可能是您最好的選擇。使用 CTR,IV 不需要是隨機的,只需唯一,因此您可以將每個單元格的 IV 計算為與行 IV/nonce 的偏移量。只需確保您的偏移算法將始終為每個 CTR 塊生成唯一的輸入。例如,如果單元格的長度最多為 256 個塊,則可以使用單元格中最右邊的字節,下一個字節用於單元格索引,其餘字節用於行隨機數。
如果您可以以不可預測的方式從行 IV 導出每個單元格 IV,則 CBC 也是一種選擇。例如使用 $ HMAC(k, r || i) $ , 在哪裡 $ r $ 是第 IV 行和 $ i $ 行索引。不過,這比較慢。(您也可以使用分組密碼來推導它。)
無論如何,您還應該確保在覆蓋單元格時密鑰和 IV 會有所不同。對於每行 IV,這意味著需要用新的 IV 重寫整行。
總而言之,要麼將整行加密並作為一個整體進行身份驗證,要麼讓每個單元都有自己的 IV 和 MAC,這可能更簡單。這些選項也允許您只使用經過身份驗證的加密模式。